要利用C语言的可变参数,我们必须首先导入stdarg.h文件,其中定义了
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 arg1, ...); void main(){ print(3, "aaa", "bbb", "ccc"); } void print(int arg1, ...){ va_list arg_ptr; char* str= NULL; va_start(arg_ptr, arg1); for(int i = 0; i < arg1; i++){ str = va_arg(arg_ptr, char*); printf("%s ", str); } va_end(arg_ptr); }
由于我们不知道调用者用传几个参数,所以用第一个参数指定参数个数,还有一种方法是让最后一个参数为NULL,例如:
void print(int arg1, ...); void main(){ print(5, "aaa", "bbb", "ccc",NULL); } void print(int arg1, ...){ va_list arg_ptr; char* str= NULL; va_start(arg_ptr, arg1); for(;;){ str = va_arg(arg_ptr, char*); if(!str) break; printf("%s ", str); } va_end(arg_ptr); }
