2017-08-25 91 views
0

我有一个调试安装程序,你在Makefile中设置了各种调试标志,然后在每个源文件有:C预处理器 - 定义宏的不同取决于另一个宏

#ifdef DEBUG_FLAG 
# define DEBUGGING(...) Something(__VA_ARGS__) 
#else 
# define DEBUGGING(...) do {} while(0) 
#endif 

我想提出这个更简洁由具有源文件这样说:

#define DEBUGGING(...) DEBUG_HELP(DEBUG_FLAG, Something(__VA_ARGS__)) 

其中DEBUG_HELP是在报头中定义,具有相同的最终结果使用DEBUGGING宏会引起Something,即被调用,仅当DEBUG_FLAG被定义为非零。如果DEBUG_FLAG根本没有定义,那么代码仍然应该编译,而不是调用Something

这可能吗?

到目前为止我的尝试,我还没有能够找出一种方法,在DEBUG_FLAG根本没有定义的情况下不会得到编译错误。

+0

是否对DEBUG_HELP的定义方式有限制?它可以用'#ifdef DEBUG_FLAG'条件包装吗? – user694733

+0

也许我错过了这里的东西,但为什么你不能简单地做'#if DEBUG_FLAG #define DEBUGGING(...)Something(__VA_ARGS__) #endif'? – Lundin

+0

[测试预处理符号是否在宏内部定义](https://stackoverflow.com/questions/26099745/test-if-preprocessor-symbol-is-defined-inside-macro) – Groo

回答

0

你可能在单独的头文件中有条件。

debug_help.h

#ifdef DEBUG_FLAG 
    #define DEBUG_HELP(...) __VA_ARGS__ 
#else 
    #define DEBUG_HELP(...) do {} while(0) 
#endif 

some_source_module.c

#include "debug_help.h" 
#define DEBUGGING(...) DEBUG_HELP(puts(__VA_ARGS__)) 

DEBUGGING("test"); // expands to puts("test"); when DEBUG_FLAG is defined 

你可以省略#include "debug_help.h"如果你能编译器自动将其包含在每个编译单元。