可变宏参数个数
#define PR(X, ...) printf("Message X" __VA_ARGS__)
符号(...)对应后面的预定义的宏(__VA_ARGS__),如果有多个参数,省略号必须作为最后一个参数,第一个参数为‘X’,后面可以接个数可变的参数。
可变函数参数个数
要实现函数参数个数可变,需要头文件(stdarg.h)和以下步骤:
- 在函数原型中使用省略号
- 在函数定义中创建一个va_list类型的变量
- 用宏将该变量初始化为一个参数列表
- 用宏访问这个参数列表
- 用宏完成清理工作
同可变宏参数一样,如果有多个参数,省略号也同样必须作为最后一个参数。
void f1 (int n, ...);
int f2 (int n, const char * s, ...);
上面例子中,参数n表示省略号部分代表的参数个数,用头文件stdargs.h中声明的
va_list类型定义一种数据对象来存放参数列表中省略号部分代表的参量,然后使用stdargs.h头文件中定义的宏
va_start()把参数列表复制到va_list变量中,用stdargs.h头文件中定义的宏
va_arg()来访问参数列表,第一次调用
va_arg()返回参数列表的第一项,下次调用返回参数列表的第二项,依次类推。使用stdargs.h头文件中定义的宏
va_end()来完成清理工作。
例子:
[clef@rhel6164 test]$ cat test5.c
#include <stdio.h>
#include <stdarg.h>
double sum(int, ...);
int main(void)
{
double s, t;
s = sum(3, 1.1, 2.5, 13.3);
t = sum(6, 1.1, 2.1, 13.1, 4.1, 5.1, 6.1);
printf("return value for sum(3, 1.1, 2.5, 13.3):%g\n", s);
printf("return value for sum(6, 1.1, 2.1, 13.1, 4.1, 5.1, 6.1):%g\n", t);
return 0;
}
double sum(int lim, ...)
{
va_list ap;
double tot = 0;
int i;
va_start(ap, lim);
for(i = 0; i < lim; i++)
tot += va_arg(ap, double);
va_end(ap);
return tot;
}
编译&执行:
[clef@rhel6164 test]$ gcc ./test5.c -std=c99
[clef@rhel6164 test]$ ./a.out
return value for sum(3, 1.1, 2.5, 13.3):16.9
return value for sum(6, 1.1, 2.1, 13.1, 4.1, 5.1, 6.1):31.6
友情链接:C语言类函数宏和一般函数的区别