GNUC语⾔宏定义#args##args
如果⼤家看到,下记代码,⼀些⼈⼀定会有⼀些疑问
#define DBG_OUTPUT(fmt, )printf("CK File[%s:%s(%d)]:" fmt "\n",__FILE__,__FUNCTION__,__LINE__,##args) 是什么?
##args 是什么?
如何应⽤?
如何传递?
..........
GCC编译器中的CPP预编译器,是⽀持这种写法的, ⽐ args,... 的写法可读性较好。
含义:应该是DBG_OUTPUT的参数,第⼀个传给fmt, 第⼆个开始传给可为多个。
②##args
##args的意思,就是把中的多个参数,串连起来。
另外,如果写成 #fmt的话,就是把fmt传进来的内容以字符串形式输出。(下⾯例⼦中会说明)
例代码①
#include<stdio.h>
#define DBG_OUTPUT()printf("CK File[%s:%s(%d)]:" fmt "\n",__FILE__,__FUNCTION__,__LINE__,##args)
int
main(int argc,char**argv){
char                j;
unsigned char        k;
j = 0xF1;
k = 0xF1;
DBG_OUTPUT("j[%d]k[%d]", j, k);
/* printf("CK File[%s:%s(%d)]:" "j[%d]k[%d]" "\n", __FILE__, __FUNCTION__, __LINE__, j, k) */
return 0;
}/* test.c */
gnu编译器可以看出来么?
DBG_OUTPUT("j[%d]k[%d]", j, k); 预编译后实际内容就是其下⾏的注释中的内容。
"j[%d]k[%d]"作为⼀个参数,传递给了fmt。(包含 ""双引号)
j, k 作为两个参数传给 , 在printf语句中,使⽤的是##args,所以这两个参数,被串联放在了printf语句中。
下⾯说明#fmt(就是⼀个#符号是什么意思)
#include<stdio.h>
#define DBG_OUTPUT()printf("CK File[%s:%s(%d)]:"#fmt "\n",__FILE__,__FUNCTION__,__LINE__,##args)
int
main(int argc,char**argv){
char                j;
unsigned char        k;
j = 0xF1;
k = 0xF1;
DBG_OUTPUT(j[%d]k[%d], j, k);
/* printf("CK File[%s:%s(%d)]:" "j[%d]k[%d]" "\n", __FILE__, __FUNCTION__, __LINE__, j, k) */
return 0;
}/* test.c */
与前⼀例代码有 2 点不同。
①DBG_OUTPUT的宏定义的printf语句中,将fmt换成了#fmt
②main()函数中的DBG_OUTPUT的语句中,""双引号,去掉了。
也就是说,j[%d]k[%d]作为⼀个参数传递给了fmt,在printf中使⽤的是#fmt,所以j[%d]k[%d]作为字符串输出,相当于"j[%d]k[%d]"。所以,两段例代码的注释部分是完全⼀样的。输出结果当然也⼀样。
注:
GCC的option -E 为向标准输⼊输出中,输出预编译结果。
所以,通过命令
$ gcc -E test.c >& test.i
(⽣成预编译结果,保存在test.i的⽂本⽂件中)
再打开,test.i⽂件,在最下⾯到原DBG_OUTPUT语句的位置,看其被预编译替换成了什么?
这样就更好理解了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。