Avatar ·

为什么C++宏中会使用无意义的do-while和if-else?

你好!我开始学习C++,遇到了宏中一种奇怪的模式。我经常在库代码(例如Qt或Boost)中看到这样的结构: ```cpp #define LOG_ERROR(msg) do { \ std::cerr << "ERROR: " << msg << std::endl; \ } while(0) ``` 或者: ```cpp #define SAFE_DELETE(p) if(p) { delete p; p = nullptr; } else (void)0 ``` 乍一看,这看起来完全无意义。为什么要写`do { ... } while(0)`,如果循环只执行一次?为什么不直接写: ```cpp #define LOG_ERROR(msg) std::cerr << "ERROR: " << msg << std::endl ``` 我尝试在没有do-while的情况下使用简单的宏,它在简单情况下可以工作。但后来我把它插入到if-else条件中,代码就出错了。例如: ```cpp #define LOG_ERROR(msg) std::cerr << "ERROR: " << msg << std::endl if (error) LOG_ERROR("Something went wrong"); else std::cout << "OK" << std::endl; ``` 编译器报错或出现奇怪的行为。你能解释一下吗?