Avatar ·

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

¡Hola a todos! Llevo escribiendo en C++ alrededor de seis meses y empecé a entender las macros del preprocesador. A menudo en código ajeno y en archivos de cabecera del sistema (por ejemplo, en Boost o Qt) veo macros envueltas en construcciones extrañas como `do { ... } while(0)` o `if (1) { ... } else (void)0`. Aquí hay un ejemplo: ```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 ``` A primera vista parece completamente sin sentido: ¿por qué usar un `do-while` que se ejecuta garantizadamente una sola vez? ¿Por qué no escribir simplemente un bloque de código entre llaves? ¿Y qué es ese extraño `else (void)0` al final de la segunda macro? Intenté escribir mi propia macro sin estos envoltorios: ```cpp #define BAD_MACRO(x) \ int y = x * 2; \ std::cout << y << std::endl; ``` Y me encontré con un problema: si la uso dentro de una condición `if`, el código se comporta de manera inesperada. Por ejemplo: ```cpp