c - 没有括号的类似函数的 C 宏

标签 c debugging macros

我在嵌入式设备代码库中遇到了以下调试宏:

extern void DebugPrint(uint8_t *s);

#define DEBUG_MSG(x)   do { PRINT_CURRENT_TIME; \
                            DebugPrint x ; } while(0)

由于在宏主体(在 DebugPrint x 部分)中 x 周围没有括号,所有对该宏的调用(在整个代码库中)添加另一组字符串周围的括号:

DEBUG_MSG(("some debug text"));

这样做有什么理由吗?它是否简化了在发布版本或类似的东西中优化这些调用?还是只是胡说八道?

我想也许会有更多参数的 DebugPrint 重载,但没有。

最佳答案

这是一个理论:

预处理器以模仿编译器表达式解析的方式解析宏展开的参数。特别是它将括号中的术语解析为单个参数。

所以 DEBUG_MSG 作者的意图可能是强制使用括号。

DebugPrint 打印函数实际上是一个 printf 风格的 variadic 函数时,这可能有意义。您可以使用单个字符串文字或可变数量的参数调用该函数:

DEBUG_MSG(("reached this point in code"));

DEBUG_MSG(("value of x = %i", x));

但这纯粹是猜测。不能直接问作者吗?

关于c - 没有括号的类似函数的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32453136/

相关文章:

c++ - #define 指令有多个替换?

我不能生成一个新线程来处理新的 UDP "connection"吗?

c++ - 为什么我在字符串和 vector 上得到两个不同的结果

javascript - 如何在 Chrome 开发者工具中调试由 javascript 加载的部分 View 内的脚本?

debugging - Azure:无法连接到远程调试器

Java:如何访问没有 "getXXX"方法的对象的子对象到该子对象

c - 使用 make 将多个 .c 文件链接到一个程序中?

c - 关于交换循环的性能问题

macros - 为什么这个 clojure 函数没有执行?

我们可以删除 C 宏定义中参数周围的括号吗?