利用可变参数宏__VA_ARGS__打造属于自己的DEBUG宏

来源:互联网 发布:mac excel 公式求值 编辑:程序博客网 时间:2024/06/05 21:15
  1. (什么是"__VA_ARGS__"?) __VA_ARGS__专业点说叫做可变参数宏,说白了就是在预处理阶段所使用的特殊标识符。而且这个可变参数宏只有在gcc所支持的C99规范中可用(前面可是提到过地奋斗)。
  2. (一般用它做甚?)目前稍微正规一点的代码中都会利用这个宏来完成调试信息的打印。
  3. (给个最最简单的例子)苍白的表述不如寥寥几行的范例。如
    #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;}