我在嵌入式设备代码库中遇到了以下调试宏:
extern void DebugPrint(uint8_t *s);
#define DEBUG_MSG(x) do { PRINT_CURRENT_TIME; \
DebugPrint x ; } while(0)
由于宏体(x
部分)中DebugPrint x
周围没有括号,所有对此宏的调用(遍及代码库)都会在字符串周围添加另一组括号:
DEBUG_MSG(("some debug text"));
有什么理由这样做吗?它是否简化了在发布版本中的这些调用的优化,或类似的东西?或者这只是简单的废话?
我想也许会有更多参数的DebugPrint
的额外重载,但是没有。
答案 0 :(得分:9)
这是一个理论:
预处理器以模仿编译器表达式解析的方式解析宏扩展的参数。特别是它将括号中的术语解析为单个参数。
因此...
Text="{Binding SelectedEntity.Item1}"
...
ItemsSource="{Binding Entities}"
SelectedItem="{Binding SelectedEntity}">
作者的意图可能是强制使用括号。
当DEBUG_MSG
打印函数实际上是DebugPrint
样式可变参数函数时,这可能有意义。您可以使用单个字符串文字或可变数量的参数调用该函数:
printf
但这是纯粹的猜测。你能问问作者吗?
答案 1 :(得分:1)
我相信没有。宏被编译器取代,因此它们与执行速度无关。这样:
#define MACRO(x) do_something(x)
MACRO("test");
与此没什么不同
#define MACRO(x) do_something x
MACRO(("test"));
由于编译器将使用相同的输出替换它们:
do_something("test");
然后编译生成相同的目标代码。