Pourquoi utiliser apparemment insignifiantes, do-while et if-else dans les macros?

Dans beaucoup de C/C++ macros je vais voir le code de la macro enveloppé dans ce qui semble être un sens do while boucle. Ici sont des exemples.

#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else

Je ne peux pas voir ce que le do while est en train de faire. Pourquoi ne pas simplement écrire ceci sans elle?

#define FOO(X) f(X); g(X)
Pour l'exemple avec l'autre, je voudrais ajouter une expression de void type à la fin... comme ((void)0).
Rappel que le do while construire n'est pas compatible avec le retour des déclarations, de sorte que le if (1) { ... } else ((void)0) construire a plus compatibles avec les usages dans le Standard c Et en C de GNU, vous allez préférer la construction décrite dans ma réponse.

OriginalL'auteur jfm3 | 2008-09-30