代码编写如下,
#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__, \*
答案 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而不是定义它/保持未定义。
我通常使用第一个选项。