Avatar ·

Warum verwenden C++-Makros sinnlose do-while und if-else?

Hallo! Ich habe angefangen, C++ zu lernen und bin auf ein seltsames Muster in Makros gestoßen. In Bibliothekscode (z.B. in Qt oder Boost) sehe ich oft solche Konstrukte:\n\n```cpp\n#define LOG_ERROR(msg) do { \ std::cerr << "ERROR: " << msg << std::endl; \} while(0)\n```\n\nOder:\n\n```cpp\n#define SAFE_DELETE(p) if(p) { delete p; p = nullptr; } else (void)0\n```\n\nAuf den ersten Blick sieht das völlig sinnlos aus. Warum `do { ... } while(0)` schreiben, wenn die Schleife genau einmal ausgeführt wird? Und warum nicht einfach schreiben:\n\n```cpp\n#define LOG_ERROR(msg) std::cerr << "ERROR: " << msg << std::endl\n```\n\nIch habe versucht, ein einfaches Makro ohne do-while zu verwenden, und es hat im einfachen Fall funktioniert. Aber dann habe ich es in eine if-else-Bedingung eingefügt, und der Code ist kaputtgegangen. Zum Beispiel:\n\n```cpp\n#define LOG_ERROR(msg) std::cerr <<