没有括号的函数式C宏

时间:2015-09-08 08:43:28

标签: c debugging macros

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

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的额外重载,但是没有。

2 个答案:

答案 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");

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