Pourquoi utilise-t-on des do-while et if-else apparemment inutiles dans les macros C++ ?
Bonjour ! J'ai commencé à étudier le C++ et je suis tombé sur un motif étrange dans les macros. Je vois souvent dans le code des bibliothèques (par exemple, dans Qt ou Boost) des constructions comme :
```cpp
#define LOG_ERROR(msg) do { \
std::cerr << "ERROR: " << msg << std::endl; \
} while(0)
```
Ou :
```cpp
#define SAFE_DELETE(p) if(p) { delete p; p = nullptr; } else (void)0
```
À première vue, cela semble totalement inutile. Pourquoi écrire `do { ... } while(0)`, si la boucle s'exécute exactement une fois ? Et pourquoi ne pas écrire simplement :
```cpp
#define LOG_ERROR(msg) std::cerr << "ERROR: " << msg << std::endl
```
J'ai essayé d'utiliser une macro simple sans do-while, et elle a fonctionné dans un cas simple. Mais ensuite, je l'ai insérée dans une condition if-else, et le code s'est cassé. Par exemple :
```cpp
#define LOG_ERROR(msg) std::cerr <<