假设由于某种原因您需要编写一个宏: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 编译成功,即使没有分号,因为代码块不需要分号。
有没有办法编写一个宏以使其通过所有三个示例?
注意:我提交我自己的答案作为共享提示的公认方式的一部分,但如果有人有更好的解决方案,请随时在此处发布,它可能会比我的方法获得更多的选票。:)