Avatar ·

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

Olá a todos! Programo em C++ há cerca de seis meses e comecei a estudar macros do pré-processador. Frequentemente, em código alheio e em arquivos de cabeçalho do sistema (como Boost ou Qt), vejo macros envolvidas em construções estranhas como `do { ... } while(0)` ou `if (1) { ... } else (void)0`. Aqui está um exemplo: ```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 ``` À primeira vista, isso parece completamente sem sentido: por que usar um `do-while` que é garantido de executar exatamente uma vez? Por que não escrever simplesmente um bloco de código entre chaves? E o que é esse estranho `else (void)0` no final da segunda macro? Tentei escrever minha própria macro sem esses invólucros: ```cpp #def