Warum werden in C++-Makros sinnlose do-while und if-else verwendet?
Hallo zusammen! Ich schreibe seit etwa einem halben Jahr C++ und habe begonnen, mich mit Präprozessor-Makros zu beschäftigen. Oft sehe ich in fremdem Code und in System-Header-Dateien (z.B. in Boost oder Qt) Makros, die in seltsame Konstrukte wie `do { ... } while(0)` oder `if (1) { ... } else (void)0` eingewickelt sind. Hier ist ein Beispiel:
```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
```
Auf den ersten Blick sieht das völlig sinnlos aus: Warum ein `do-while` verwenden, das garantiert genau einmal ausgeführt wird? Warum nicht einfach einen Code-Block in geschweiften Klammern schreiben? Und was soll dieses seltsame `else (void)0` am Ende des zweiten Makros?
Ich habe versucht, mein eigenes Makro ohne diese Umhüllungen zu schreiben:
```cpp
#def