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

  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(...) 
#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;
}

你可能感兴趣的:(Linux下编译器之探索)