Pourquoi utilise-t-on des do-while et if-else apparemment inutiles dans les macros C++ ?
Bonjour à tous ! J'écris en C++ depuis environ six mois et j'ai commencé à me plonger dans les macros du préprocesseur. Dans du code écrit par d'autres et dans les fichiers d'en-tête système (par exemple dans Boost ou Qt), je vois souvent des macros enveloppées dans des constructions étranges comme `do { ... } while(0)` ou `if (1) { ... } else (void)0`. Voici un exemple :
```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
```
À première vue, cela semble totalement inutile : pourquoi utiliser un `do-while` qui est garanti de s'exécuter exactement une fois ? Pourquoi ne pas simplement écrire un bloc de code entre accolades ? Et que fait ce bizarre `else (void)0` à la fin de la deuxième macro ?
J'ai essayé d'écrire ma propre macro sans ces enveloppes :
```cpp
#def