C语言中一般的函数参数都是固定的,包括参数数量和参数类型,但有时参数的数量在执行期前无法确定,该怎么办呢?C语言提供了可变参数的语法,大家最熟悉和常用的函数printf()就是可变参数函数:
int printf( const char* format, ...);
在实现时,需要用到三个宏:va_start(), va_arg()和va_end(),其定义如下:
typedef char * va_list;
#define _INTSIZEOF(n) /
((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) /
( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
利用这些宏,就可以实现可变参数函数了:
void print(int x, ...)
{
va_list arg;
int y=0;
va_start(arg_ptr, x);
y=va_arg(arg, int);
va_end(arg);
printf("%d %d\n", x, y);
}
实现可变参数的关键在于,调用函数时,函数参数依次入栈,在栈中是相邻的(但未必连续)。