#define LOG_MSG(...)用于调试

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)

Joh*_*ica 9

根据值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)