Nam*_*tha 5 c debugging c-preprocessor
以下代码如何工作?
#define ENABLE_DEBUG 1
#if ENABLE_DEBUG
#define LOG_MSG printf
#else
#define LOG_MSG(...)
#endif
Run Code Online (Sandbox Code Playgroud)
根据值ENABLE_DEBUG
,LOG_MSG
可以将其定义为别名,printf()
也可以将其定义为无操作宏.暗示您可以将值更改0
为禁用调试.这是一种常用的技术,可以轻松地在显示大量输出的调试版本和安静的版本构建之间切换.
#define LOG_MSG printf
Run Code Online (Sandbox Code Playgroud)
这使它成为别名printf()
.
#define LOG_MSG(...) /* empty */
Run Code Online (Sandbox Code Playgroud)
这将它定义为一个空宏.请注意,这里有一组括号,表示宏接受参数.事后没有任何东西意味着它完全没有扩展.并且...
表明该宏可以采用不同数量的参数.此语法是C99扩展,因此可能无法在较旧的C编译器上使用.
LOG_MSG("file not found\n");
Run Code Online (Sandbox Code Playgroud)
结果是,LOG_MSG()
调用将打印消息或不执行任何操作,具体取决于是否启用了日志记录.
// If ENABLE_DEBUG is non-zero, a debugging printout:
printf("file not found\n");
// If ENABLE_DEBUG is zero, an empty statement:
;
Run Code Online (Sandbox Code Playgroud)
对于它的价值,无论是谁创作这个宏都可以通过使用...
语法(他/她很熟悉)替换第一个定义来做得更好,打印到stderr而不是stdout:
#define LOG_MSG(...) fprintf(stderr, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)