Avatar ·

¿Por qué en las macros de C++ se usan do-while y if-else sin sentido?

¡Hola! Empecé a estudiar C++ y me topé con un patrón extraño en las macros. A menudo veo en el código de bibliotecas (por ejemplo, en Qt o Boost) construcciones como: ```cpp #define LOG_ERROR(msg) do { \ std::cerr << "ERROR: " << msg << std::endl; \ } while(0) ``` O: ```cpp #define SAFE_DELETE(p) if(p) { delete p; p = nullptr; } else (void)0 ``` A primera vista, esto parece completamente sin sentido. ¿Por qué escribir `do { ... } while(0)` si el bucle se ejecuta exactamente una vez? ¿Y por qué no escribir simplemente: ```cpp #define LOG_ERROR(msg) std::cerr << "ERROR: " << msg << std::endl ``` Probé a usar una macro simple sin do-while, y funcionó en un caso simple. Pero luego la inserté en una condición if-else, y el código se rompió. Por ejemplo: ```cpp #define LOG_ERROR(msg) std::cerr << "ERROR: " << msg << std::endl if (error) LOG_ERROR("Something went wrong"); else std::cout << "OK" << std::endl; ``` El compilador dio un error o un comportamiento extraño. ¿Pueden explicarlo?