在c中制作调试打印宏时出错

时间:2017-08-02 06:41:53

标签: c gcc

代码编写如下,

#define print_err(fmt, ...) \
    do { if (DEBUG_ERR) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
                            __LINE__, __func__, ##__VA_ARGS__); } while (0)

我收到错误,如果没有定义DEBUG_ERR宏。使用gcc 5.4.0进行编译。如果定义了宏DEBUG_ERR,则没有问题。

include/tmp.h:54:18: error: ‘DEBUG_ERR’ undeclared (first use in this function)
         do { if (DEBUG_ERR) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \*

3 个答案:

答案 0 :(得分:2)

宏内的if指令是C指令,而不是预处理器指令(不能嵌套预处理器指令)

即使不能激活调试,也必须定义DEBUG_ERR 。将其设置为0,希望编译器能够优化您的语句。

你可以做的是测试外面的DEBUG_ERR宏,如果没有定义则定义空宏:

#ifdef DEBUG_ERR
#define print_err(fmt, ...) \ do { fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \ __LINE__, __func__, ##__VA_ARGS__); } while (0)
#else
#define print_err(fmt, ...) do {} while(0)
#endif

答案 1 :(得分:0)

您还可以将DEBUG_ERR定义为另一个宏。然后你可以摆脱if in print_err

#ifdef DEBUG_ERR
#define print_err(fmt, ...) \
    do { fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
         __LINE__, __func__, ##__VA_ARGS__); } while (0)
#else
#define print_err(fmt, ...)
#endif

答案 2 :(得分:0)

要对预处理器#define的定义/非定义进行条件限制,必须使用#ifdef或#if defined。

例如,请参阅this description of #if defined

如果要在条件代码中使用它,可以将其定义为0或1,然后可以在“if”中使用它。

所以你可以这样做:

#ifdef DEBUG_ERR
#define print_err(fmt, ...) \
            do {  fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
                           __LINE__, __func__, ##__VA_ARGS__); } while (0)
#else
#define print_err(fmt, ...)
#endif

或者按照你的方式做,但是将DEBUG_ERR定义为1或0而不是定义它/保持未定义。

我通常使用第一个选项。