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更多参数的额外重载,但没有.
这是一个理论:
预处理器以模仿编译器表达式解析的方式解析宏扩展的参数.特别是它将括号中的术语解析为单个参数.
因此,DEBUG_MSG作者的意图可能是强制使用括号.
当DebugPrintprint函数实际上是printf样式可变参数函数时,这可能是有意义的.您可以使用单个字符串文字或可变数量的参数调用该函数:
DEBUG_MSG(("reached this point in code"));
DEBUG_MSG(("value of x = %i", x));
Run Code Online (Sandbox Code Playgroud)
但这是纯粹的猜测.你能问问作者吗?