Avatar ·

为什么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