##args的意思,就是把args…中的多个参数,串连起来。
如果写成 #fmt的话,就是把fmt传进来的内容以字符串形式输出。
写法一:
#include <stdio.h>
#define DBG_OUTPUT(fmt,args...) 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;
}
1.DBG_OUTPUT的宏定义的printf语句中,是#fmt
2.main()函数中的 DBG_OUTPUT的语句中,""双引号,去掉了。
3.对于char j,默认是有符号的。0xF1: 11110001,是个负数,负数表示法是取反加1,因此,还原回去,就是减1,取反,打印出来值是-15.
j[%d]k[%d]作为一个参数传递给了fmt,在printf中使用的是#fmt, 所以 j[%d]k[%d]作为字符串输出,相当于" j[%d]k[%d] "。
写法二:
#include <stdio.h>
#define DBG_OUTPUT(fmt,args...) 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;
}
1.宏中是fmt,传递参数是字符串
执行结果都是:
CK File[main.c:main(25)]:j[-15]k[241]
转载自:https://blog.csdn.net/u013187074/article/details/78874976