没有括号的类似函数的 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));
但这纯粹是猜测。不能直接问作者吗?
我在嵌入式设备代码库中遇到了以下调试宏:
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));
但这纯粹是猜测。不能直接问作者吗?