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

发布于 2024-09-12 13:37:03 字数 151 浏览 4 评论 0原文

下面的代码是如何工作的?

#define ENABLE_DEBUG 1

#if ENABLE_DEBUG
    #define LOG_MSG printf
#else
    #define LOG_MSG(...)
#endif

How does the following code work?

#define ENABLE_DEBUG 1

#if ENABLE_DEBUG
    #define LOG_MSG printf
#else
    #define LOG_MSG(...)
#endif

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烟若柳尘 2024-09-19 13:37:03

根据 ENABLE_DEBUG 的值,LOG_MSG 要么定义为 printf() 的别名,要么定义为无操作宏。这意味着您可以将该值更改为 0 以禁用调试。这是一种常见的技术,可以轻松地在显示大量输出的调试版本和安静的发布版本之间切换。

#define LOG_MSG printf

这使其成为 printf() 的别名。

#define LOG_MSG(...)    /* empty */

这将其定义为一个空宏。请注意,这里它有一组括号,这意味着宏需要参数。之后它就什么也没有了,这意味着它会扩展为完全没有。 ... 表示该宏可以采用 不同数量的参数。此语法是 C99 扩展,因此它可能不适用于较旧的 C 编译器。

LOG_MSG("file not found\n");

结果是 LOG_MSG() 调用将打印一条消息或不执行任何操作,具体取决于是否启用日志记录。

// If ENABLE_DEBUG is non-zero, a debugging printout:
printf("file not found\n");

// If ENABLE_DEBUG is zero, an empty statement:
;

无论如何,无论谁编写了这个宏,都可以通过使用 ... 语法(他/她显然熟悉)替换第一个定义来做得更好,并打印到 stderr而不是标准输出:

#define LOG_MSG(...) fprintf(stderr, __VA_ARGS__)

Depending on the value of ENABLE_DEBUG, LOG_MSG is either defined to be an alias for printf() or it is defined as a no-op macro. It is implied that you can change the value to 0 to disable debugging. This is a common technique for making it easy to switch between debugging builds which display lots of output and release builds which are quiet.

#define LOG_MSG printf

This makes it an alias for printf().

#define LOG_MSG(...)    /* empty */

And this defines it as an empty macro. Notice that here it has a set of parentheses, which means the macro takes parameters. It has nothing afterwards which means it expands to absolutely nothing. And the ... indicates that this macro can take a varying number of arguments. This syntax is a C99 extension so it may not be available on older C compilers.

LOG_MSG("file not found\n");

The result is that a LOG_MSG() call will either print a message or do nothing depending on whether logging is enabled.

// If ENABLE_DEBUG is non-zero, a debugging printout:
printf("file not found\n");

// If ENABLE_DEBUG is zero, an empty statement:
;

For what it's worth, whoever authored this macro could've done a better job by replacing the first definition with one using the ... syntax (which he/she is clearly familiar with), printing to stderr instead of stdout:

#define LOG_MSG(...) fprintf(stderr, __VA_ARGS__)
夜雨飘雪 2024-09-19 13:37:03

这使用预处理器在编译之前更改代码。
如果 ENABLE_DEBUG 被定义为 1,每当预处理器看到

LOG_MSG("something happened");

它会将其替换为

printf("something happened");

如果它被定义为 0,或者未定义,它将用任何内容替换它(正如刚刚发布的另一个答案所说) )。

This uses the preprocessor to change code before compilation.
If ENABLE_DEBUG is defined as 1, whenever the preprocessor sees

LOG_MSG("something happened");

It will replace it with

printf("something happened");

If it is defined as 0, or not defined it will replace it with nothing (as the other answer that has just been published says).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文