可变参数编程的三个宏:(VS2012)
可变参数编程是通过宏来实现的,这些宏定义于stdarg.h头文件中,它是标准库的一部分。这个头文件声明了一个类型va_list和三个宏----va_start、va_arg和va_end。
一个类型va_list:typedef char * va_list;
三个宏:
va_start:
#define _ADDRESSOF(v) ( &reinterpret_cast<const char &>(v) )
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define va_start _crt_va_start
va_arg:
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_arg _crt_va_arg
va_end:
#define _crt_va_end(ap) ( ap = (va_list)0 )
#define va_end _crt_va_end
注:先往下走,然后取数据,有临时变量。
举例:
# include <stdio.h>
# include <assert.h>
# include <stdarg.h>
int max_list(int num, ...) //统计任意数目的整数参数函数
{
int n;
va_list var_arg;
assert(num >=0);
va_start (var_arg , num); //开始
int max = va_arg(var_arg ,int); //最大值初始化
while ((n = va_arg (var_arg , int )) >=0)
{
if (n>max)
{
max = n;
}
}
va_end (var_arg);
return max;
}
int main()
{
int m = max_list(4, 33, 33, 23, 56, -1); //测试
printf("%d\n", m);
return 0;
}