¿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?