- (什么是"__VA_ARGS__"?) __VA_ARGS__专业点说叫做可变参数宏,说白了就是在预处理阶段所使用的特殊标识符。而且这个可变参数宏只有在gcc所支持的C99规范中可用(前面可是提到过地)。
- (一般用它做甚?)目前稍微正规一点的代码中都会利用这个宏来完成调试信息的打印。
- (给个最最简单的例子)苍白的表述不如寥寥几行的范例。如
#ifdef DEBUG #define DBG(...) printf(__VA_ARGS__) #else #define DBG(...)#endif
需要说明的是"…"代表可变的参数列表,__VA_ARGS__会代替可变参数传参给printf()。这样DBG("TEST!") -->printf("TEST!"),同样DBG("%s:%s","CS","DN")-->printf("%s:%s","CS","DN"),而且通过定义DEBUG宏就可以作为调试信息是否打印出来的开关。
4.不能手懒,写个linux下测试代码。
#include "stdio.h"
#define DEBUG_MODE
#ifdef DEBUG_MODE
#define DBG_PRI(...) \
printf(__VA_ARGS__)
#define DBG_WAIT(...) \
printf(__VA_ARGS__);\
getchar()
#define DBG_ERROR(...) \
fprintf(stderr,"%s|%s|%d\r\n",__FILE__,__func__,__LINE__);\
fprintf(stderr,__VA_ARGS__)
#define DBG_ASSERT(x) \
if((x) == 0){\
fprintf(stderr,"%s|%s|%d\r\n",__FILE__,__func__,__LINE__);\
while(getchar()!='q');\
}
#else
#define DBG_PRI(...)
#define DBG_ASSERT(x)
#define DBG_WAIT(...)
#define DBG_ERROR(...)
#endif
char usage[]={
"\r\n"
"\r\n======================="
"\r\n"
"\r\n 1:test DBG_WAIT"
"\r\n 2:test DBG_ERROR"
"\r\n 3:test DBG_ASSERT"
"\r\n 0:EXIT"
"\r\n======================="
"\r\n"
"\r\n Enter Choice:"
};
int main(int argc,char*argv[])
{
char *hdl =NULL;
char cmd;
int done = 0;
do{
DBG_PRI(usage);
cmd = getchar();
while(getchar()!='\n');
switch(cmd){
case '1':
DBG_WAIT("Press Any Key to Continue\n");
DBG_PRI("done\n");
break;
case '2':
DBG_ERROR("testing DBG_ERROR(X)\n");break;
case '3':
DBG_PRI("testing DBG_ASSERT(X) Please Enter 'q' to continue\n");
DBG_ASSERT(hdl);break;
case '0':
done = 1;break;
}
}while(!done);
return 0;
}