Avatar ·

Por que macros C++ usam do-while e if-else sem sentido?

Olá! Comecei a estudar C++ e me deparei com um padrão estranho em macros. Frequentemente vejo em código de bibliotecas (por exemplo, Qt ou Boost) construções como: ```cpp #define LOG_ERROR(msg) do { \ std::cerr << "ERROR: " << msg << std::endl; \ } while(0) ``` Ou: ```cpp #define SAFE_DELETE(p) if(p) { delete p; p = nullptr; } else (void)0 ``` À primeira vista, isso parece completamente sem sentido. Por que escrever `do { ... } while(0)`, se o loop é executado exatamente uma vez? E por que não escrever simplesmente: ```cpp #define LOG_ERROR(msg) std::cerr << "ERROR: " << msg << std::endl ``` Tentei usar uma macro simples sem do-while, e funcionou em um caso simples. Mas depois a inseri em uma condição if-else, e o código quebrou. Por exemplo: ```cpp #define LOG_ERROR(msg) std::cerr <<