重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
有专门的宏,处理可变参
员工经过长期磨合与沉淀,具备了协作精神,得以通过团队的力量开发出优质的产品。创新互联建站坚持“专注、创新、易用”的产品理念,因为“专注所以专业、创新互联网站所以易用所以简单”。公司专注于为企业提供网站制作、成都网站建设、微信公众号开发、电商网站开发,小程序开发,软件定制网站等一站式互联网企业服务。
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
一个简单的例子
void simple_va_fun(int i, ...)
{
va_list arg_ptr;
int j=0;
va_start(arg_ptr, i);
j=va_arg(arg_ptr, int);
va_end(arg_ptr);
printf("i=%d j=%d\bn", i, j);
return;
}
int main()
{
simple_va_fun(1);
simple_va_fun(1,2);
simple_va_fun(1,200);
return 0;
}
需要借用C语言的VA_LIST 宏定义,及相关操作来实现可变参数。VA_LIST 所在头文件:#include stdarg.h,用法如下:(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;(2)然后用VA_START宏初始化刚定义的VA_LIST变量;(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);(4)最后用VA_END宏结束可变参数的获取。以下是一个自定义打印接口的实现:pre t="code" l="cpp"int my_printf(const char *fmt, )//表示参数可变
{
va_list args;//定义va_list
static char gc_PrintfOutBuff[1000];
va_start(args, fmt);//初始化
vsnprintf((char *) gc_PrintfOutBuff, 1000, (char *) fmt, args);//这里没有使用VA_ARG取回单个变量,而是借用vsnprinf一次性读取。
va_end(args);//结束获取
puts("%s",(const char *)gc_PrintfOutBuff);//使用。
return 0;
}
__VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的。
GCC、VC2005开始支持。
#define CALCSUM(v, ...) sum(v, __VA_ARGS__)
int sum(int num_args, ...)
{
int val = 0;
va_list ap;
int i;
va_start(ap, num_args);
for (i = 0; i num_args; i++)
{
val += va_arg(ap, int);
}
va_end(ap);
return val;
}
int main(void)
{
printf("10、20 和 30 的和 = %d\n", CALCSUM(3, 10, 20, 30));
printf("4、20、25 和 30 的和 = %d\n", CALCSUM(4, 4, 20, 25, 30));
return 0;
}