¿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
No answers yet.
Inicia sesión para dejar una respuesta