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

Function-like C macro without parentheses

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

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 会有更多参数的额外重载,但 none.

我相信没有。宏被编译器取代,因此它们与执行速度无关。这个:

#define MACRO(x) do_something(x)
MACRO("test");

跟这个没什么区别

#define MACRO(x) do_something x
MACRO(("test"));

因为编译器会将它们替换为相同的输出:

do_something("test");

然后将编译生成相同的目标代码。

这是一个理论:

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

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

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

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

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

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