C++的多行宏有标准定义方式,boost
和folly
库都采用了这种方式:
#define MACRO(X) \
do { \
X = 1; \
std::cout << X; \
} while (0)
其中\
用来换行,其它最关键之处为实际运行语句用do {} while (0)
包起来。这是为什么呢?
如果直接定义如下:
#define MACRO1(X) \
X = 1; \
std::cout << X;
那么下面语句展开的结果可能不符预期:
int x = 0;
if (x == 0)
MACRO1(X);
直接用{}
包起来也不行:
#define MACRO2(X) \
{ \
X = 1; \
std::cout << X; \
}
它在下面语句展开会造成语法错误:
int x = 0;
if (x == 0)
MACRO2(X);
else
x = 2;
在标准定义中引入了多余的语句,但在现代编译器会自动优化掉这些语句,不会增加指令。
Q. E. D.