1、可变参数的函数
<stdarg.h>头文件中定义了一些宏,用于可变参数的函数,如下
va_list:这种类型声明局部状态变量,假设变量名为va(用于下面的描述),用于遍历函数。
va_start:这个宏初始化状态变量va,要先调用之后才能调用va_arg与va_end。
va_arg:这个宏返回参数表中下一个参数的值,将内部指针(在va中)移到下一个参数,下一个参数的类型要用type指定,使va_arg能够计算其在堆栈中的长度,调用va_start之后第一次调用va_arg返回第一个可变参数的值。
va_end:这个函数或宏在用va_arg读取所有参数之后调用,对va进行必要的整理操作。
va_copy:C99中新增,这个宏在dest中复制src的当前状态,在参数表中生成第二个指针,然后可以独立对src与dest采用va_arg,dest中要像src中一样调用va_end。
下面是一个简单的了例子:
#include <stdio.h> #include <stdarg.h> void printargs(int num, ...) { va_list va; va_start(va, num); int index = 0; int value = num; while (1) { printf("args[%d] = %d\n", index, value); if ((value = va_arg(va, int)) == 0) { break; } index++; } va_end(va); } int main(void) { printargs(1, 2, 3, 4, 5, 0); return 0; }
输出结果如下:
args[0] = 1 args[1] = 2 args[2] = 3 args[3] = 4 args[4] = 5
2、可变参数的宏
可变参数的宏,有两种形式,如下例子:
#define MultiArgs(format, ...) printf(format, __VA_ARGS__) #define PrintArgs(format, args...) printf(format, ##args) MultiArgs("%s, %s\n", "hello", "world!"); // hello, world! PrintArgs("%s, %s\n", "hello", "c language!"); // hello, c language!
需要注意的是,上面两种参数宏的参数列表形式的差异,PrintArgs宏的arg参数后面不能有逗号。
原文地址:http://blog.csdn.net/ieearth/article/details/45216625