Avatar ·

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