我在嵌入式设备代码库中遇到了以下调试宏:
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/