【发布时间】:2010-09-14 20:52:49
【问题描述】:
假设由于某种原因您需要编写一个宏:MACRO(X,Y)。 (假设您有充分的理由不能使用内联函数。)您希望此宏模拟对没有返回值的函数的调用。
示例 1:这应该可以按预期工作。
if (x > y)
MACRO(x, y);
do_something();
示例 2:这不应导致编译器错误。
if (x > y)
MACRO(x, y);
else
MACRO(y - x, x - y);
示例 3:这应该不编译。
do_something();
MACRO(x, y)
do_something();
编写宏的幼稚方法是这样的:
#define MACRO(X,Y) \
cout << "1st arg is:" << (X) << endl; \
cout << "2nd arg is:" << (Y) << endl; \
cout << "Sum is:" << ((X)+(Y)) << endl;
这是一个非常糟糕的解决方案,所有三个示例都失败了,我不需要解释原因。
忽略宏的实际作用,这不是重点。
现在,我最常看到宏的编写方式是将它们括在花括号中,如下所示:
#define MACRO(X,Y) \
{ \
cout << "1st arg is:" << (X) << endl; \
cout << "2nd arg is:" << (Y) << endl; \
cout << "Sum is:" << ((X)+(Y)) << endl; \
}
这解决了示例 1,因为宏位于一个语句块中。但是示例 2 被破坏了,因为我们在调用宏之后放置了一个分号。这使得编译器认为分号本身就是一个语句,这意味着 else 语句不对应任何 if 语句!最后,示例 3 编译成功,即使没有分号,因为代码块不需要分号。
有没有办法编写一个宏来传递所有三个示例?
注意:我将自己的答案作为accepted way of sharing a tip 的一部分提交,但如果有人有更好的解决方案,请随时在此处发布,它可能会比我的方法获得更多的选票。 :)
【问题讨论】:
-
宏是非类型安全的。这就是为什么你应该选择内联函数的原因。
-
@b1naryatr0phy 我认为宏的混乱是更多的问题,why not macros。
标签: c++ c-preprocessor