利用可变参数宏__VA_ARGS__打造属于自己的DEBUG宏
来源:互联网 发布:mac excel 公式求值 编辑:程序博客网 时间:2024/06/05 21:15
- (什么是"__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(...) #endifchar 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;}
- 利用可变参数宏__VA_ARGS__打造属于自己的DEBUG宏
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏 __VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- POJ:Flip Game
- 图片无缝滚动代码(向左/向下/向上)的js代码
- hadoop自带RandomWriter例子解析
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- ConcurrentHashMap原理分析
- 利用可变参数宏__VA_ARGS__打造属于自己的DEBUG宏
- C++ 引用和指针
- RubyMine
- hdu 1269 (强连通基础图)
- OLED驱动 (51单片机)
- win8系统下安装软件老是出现扩展属性不一致的错误??
- IKJEFT01用法之——Unload Table Data
- 黑马程序员 04 Java基础教学 - 04 - Java基础之数组
- 第二天,2013-04-10,就业班第一天