Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158982
  • 博文数量: 35
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 294
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-11 14:55
个人简介

努力奋斗的骚年!

文章分类

全部博文(35)

文章存档

2014年(19)

2013年(16)

分类: C/C++

2014-10-30 14:42:51

摘自程序员的自我修养

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdarg.h>

  3. int sum (int num, ...){
  4.     int *p = &num + 1;
  5.     int ret = 0;
  6.     while(num--){
  7.         ret += *p++;
  8.     }
  9.     return ret;
  10. }

  11. int main(){
  12.     int a = sum(3,4,5,1);
  13.     printf("%d",a);
  14.     return 0;
  15. }


下面让我们来看va_list等宏应该如何实现。

  va_list实际是一个指针,用来指向各个不定参数。由于类型不明,因此这个va_list以void*或char*为最佳选择。

  va_start将va_list定义的指针指向函数的最后一个参数后面的位置,这个位置就是第一个不定参数。

  va_arg获取当前不定参数的值,并根据当前不定参数的大小将指针移向下一个参数。

  va_end将指针清0。

  按照以上思路,va系列宏的一个最简单的实现就可以得到了,如下所示:

  #define va_list char*

  #define va_start(ap,arg) (ap=(va_list)&arg+sizeof(arg))

  #define va_arg(ap,t) (*(t*)((ap+=sizeof(t))-sizeof(t)))

  #define va_end(ap) (ap=(va_list)0)


阅读(1975) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~