【2015-01-22】宏返回值和可变参数宏

📅 2026/8/27 19:18:32
【2015-01-22】宏返回值和可变参数宏
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2015-01-22 标题宏返回值和可变参数宏分类编程 / C C 标签CC·宏宏返回值和可变参数宏宏返回值可变参数宏自己写的小测试宏返回值以下内容转自【 http://blog.csdn.net/fjb2080/article/details/5174171 】有删改。在使用逗号表达式中有一点需要注意的是在逗号表达式中不可以声明变量。例如intn(inta5,a);//这是错误的可以这样使用:intaintn(a5,a);那么n的值就是6另外在gcc中亦可用{}表达式作为返回值如#definefucn1(a)({aa5;a;})例如下面一个例子#includestdio.h#definefunc(a)({aa5;a;})intmain(void){//int i;//int a (i5, i);inta0;intbfunc(a);printf(a%d/n,a);printf(b%d/n,b);return0;}输出a5b5GCC对于宏返回值的描述【 http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html 】可变参数宏以下内容转自【www.cnblogs.com/caosiyang/archive/2012/08/21/2648870.html 】有删改。C99中规定宏可以像函数一样带有可变参数比如#defineLOG(format,...)fprintf(stdout,format,__VA_ARGS__)其中…表示参数可变__VA_ARGS__在预处理中为实际的参数集所替换GCC中同时支持如下的形式#defineLOG(format,args...)fprintf(stdout,format,args)其用法和上面的基本一致只是参数符号有变化有一点需要注意上述的宏定义不能省略可变参数尽管你可以传递一个空参数这里有必要提到##连接符号的用法。##的作用是对token进行连接在上例中format、__VA_ARGS__、args即是token如果token为空那么不进行连接所以允许省略可变参数(__VA_ARGS__和args)对上述变参宏做如下修改#defineLOG(format,...)fprintf(stdout,format,##__VA_ARGS__)#defineLOG(format,args...)fprintf(stdout,format,##args)自己写的小测试#includestdio.hintcalcnum(inta,intb){aab10;bb5;returnb;}#defineCALCNUM(a,b)\({\aab10;\bb5;\b;\})#defineLOGA(format,...)printf(format,__VA_ARGS__)#defineLOGB(format,...)printf(format,##__VA_ARGS__)#defineLOGC(format,xx...)printf(format,##xx)/*重命名可变参数*/intmain(void){inta3,b5;intresultcalcnum(a,b);printf(result:%d a:%d b:%d ,result,a,b);a3,b5;resultCALCNUM(a,b);printf(result:%d a:%d b:%d ,result,a,b);/* 注意这里的ab和上面的值是不同的。 *//*无可变参数无法编译通过。*/// LOGA(Hello World A);LOGB(Hello World B );LOGC(Hello World C );LOGA(Hello World A%s,OMG);LOGB(Hello World B%s,OMG);LOGC(Hello World C%s,OMG);return0;}输出result:10a:3b:5result:10a:18b:10Hello World B Hello World C Hello World A OMG Hello World B OMG Hello World C OMG