[转][C/C++] 函数中不定长参数的使用
转自http://book.51cto.com/art/200902/109024.htm
http://hi.baidu.com/zzzkkk666/blog/item/683ac15472d29e5cd10906dd.html
5.4 函数的变长参数
文件的格式化输入输出函数都支持变长参数。定义时,变长参数列表通过省略号"…"表示,因此,具有变长参数列表的函数定义格式为:
type 函数名(参数1, 参数2, 参数n, ...);
其中type为函数的返回值类型,参数1~参数n为定长参数,"..."代表变长参数,注意"..."必须定义在参数的最右端。如下例:
C语言中可变参数的宏2007年12月24日 星期一 21:09 今天来说说宏。什么?宏也能可变参数?是的,你没有听错,带参数的宏和函数一样,同样支持可变参数。下面通过一个小程序加以说明。 #include #include#define OUTSCREEN(msg, ...) printf(msg,__VA_ARGS__)int main(int argc, char* argv[]){ OUTSCREEN("Hello World!n%s", "__This is a MACRO!n"); return 0;} 这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。#define OUTSCREEN(msg, ...) printf(msg, __VA_ARGS__)int main(int argc, char* argv[]){ OUTSCREEN("Hello World!n%s", "__This is a MACRO!n"); return 0;} 假如我们将上面的代码稍作一下修改,变成下面的样子。#define OUTSCREEN(msg, ...) printf(msg, __VA_ARGS__)int main(int argc, char* argv[]){ OUTSCREEN("Hello World!"); return 0;} 注意我仅仅是将main函数里的OUTSCREEN做了修改,这时可变参数的个数为0了。但是编译的时候gcc却报错:In function `main': error: parse error before ')' token 什么原因导致出错呢?把宏展开一下看看,原来是","惹得祸。那么这种参数个数可以为0的宏要怎么写呢?C99的规范没有定义这个,gcc对此做了扩展。重新定义OUTSCREEN宏如下:#define OUTSCREEN(msg, ...) printf(msg, ##__VA_ARGS__) 当可变参数的个数为0时,这里的##起到把前面多余的","去掉,实际上变成了printf(msg),这样编译就能通过了。 另外,__VA_ARGS__这个宏实在不利于记忆,gcc对此做了扩展,另一种可接受的定义方法为:#define OUTSCREEN(msg, args...) printf(msg, ##args)贴上代码,权当练习之用#include <stdio.h>//#define OUTSCREEN(msg, ...) printf(msg, __VA_ARGS__)//#define OUTSCREEN(msg, ...) printf(msg, ##__VA_ARGS__)#define OUTSCREEN(msg, args...) printf(msg, ##args)int main(int argc, char* argv[]){OUTSCREEN("Hello World=====%s\n");//OUTSCREEN("Hello World=====%s", "__This is an example\n");// OUTSCREEN("Hello World=====%s", "__This is an example\n", "77777777777"); return 0;}??
?
?