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

Lou*_*Lou 6 c debugging macros

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

extern void DebugPrint(uint8_t *s);

#define DEBUG_MSG(x)   do { PRINT_CURRENT_TIME; \
                            DebugPrint x ; } while(0)
Run Code Online (Sandbox Code Playgroud)

由于x宏体(在DebugPrint x部分)周围没有括号,所有对此宏的调用(遍布代码库)都会在字符串周围添加另一组括号:

DEBUG_MSG(("some debug text"));
Run Code Online (Sandbox Code Playgroud)

有什么理由这样做吗?它是否简化了在发布版本中的这些调用的优化,或类似的东西?或者只是简单的废话?

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

Nik*_*uhe 9

这是一个理论:

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

因此,DEBUG_MSG作者的意图可能是强制使用括号.

DebugPrintprint函数实际上是printf样式可变参数函数时,这可能是有意义的.您可以使用单个字符串文字或可变数量的参数调用该函数:

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

DEBUG_MSG(("value of x = %i", x));
Run Code Online (Sandbox Code Playgroud)

但这是纯粹的猜测.你能问问作者吗?