为什么C++宏中会使用无意义的do-while和if-else?
大家好!我写C++大约半年了,最近开始研究预处理器宏。在别人的代码和系统头文件(比如Boost或Qt)中,我经常看到宏被包裹在奇怪的构造中,比如`do { ... } while(0)`或`if (1) { ... } else (void)0`。下面是一个例子:
```cpp
#define LOG_ERROR(msg) do { \
std::cerr << "ERROR: " << msg << std::endl; \
} while(0)
#define SAFE_DELETE(p) if (p) { delete p; p = nullptr; } else (void)0
```
乍一看这完全无意义:为什么要用`do-while`,它保证只执行一次?为什么不直接写一个花括号代码块?第二个宏末尾奇怪的`else (void)0`又是什么?
我尝试写了一个没有这些包装的宏:
```cpp
#define BAD_MACRO(x) \
int y = x * 2; \
std::cout << y << std::endl;
```
然后遇到了问题:如果在`if`条件中使用它,代码行为会出乎意料。例如:
```cpp