Double Possible:
Pourquoi il n'y a parfois pas de sens do/while et if/else en C/C++ macros?J'ai été voir cette expression depuis plus de 10 ans maintenant. J'ai essayé de réfléchir à ce que c'est bon pour. Depuis que je le vois surtout dans #définit, je suppose que c'est bon pour l'intérieur portée de la déclaration de la variable et pour l'utilisation de pauses (au lieu de gotos.)
Est-il bon pour quoi que ce soit d'autre? L'utilisez-vous?
Réponses
Trop de publicités?C'est la seule construction en C que vous pouvez utiliser pour #define
un instructions multiples fonctionnement, mettre un point-virgule après, et toujours dans un if
déclaration. Un exemple peut aider à:
#define FOO(x) foo(x); bar(x)
if (condition)
FOO(x);
else // syntax error here
...;
Même en utilisant des accolades n'aide pas:
#define FOO(x) { foo(x); bar(x); }
L'utilisation de ce dans une if
déclaration exige que vous omettez le point-virgule, ce qui est contre-intuitif:
if (condition)
FOO(x)
else
...
Si vous définissez FOO comme ceci:
#define FOO(x) do { foo(x); bar(x); } while (0)
puis le suivant est syntaxiquement correct:
if (condition)
FOO(x);
else
....
Il aide à regrouper plusieurs instructions en un seul, afin qu’une macro de type fonction peut effectivement être utilisée en fonction. Supposons que vous ayez
et vous faire
puis cela s’étend à
Notez que le deuxième appel (bar(n)) ne fait pas partie de la fi énoncé plus.
Envelopper tous les deux dans do{}while(0), et vous pouvez également utiliser la macro dans un if instruction.
Il est intéressant de noter la situation suivante où les {} de faire tout en boucle (0) ne fonctionne pas pour vous :
Si vous voulez une macro de type fonction qui retourne une valeur, alors vous aurez besoin d’une expression de la déclaration: ({stmt ; stmt ;}) au lieu {} while(0) :
De façon générique, do
/while
est valable pour toute sorte de boucle de construire où l'on doit exécuter la boucle au moins une fois. Il est possible d'émuler cette sorte de boucle, soit par une quinte while
ou même un for
boucle, mais souvent le résultat est un peu moins élégant. Je vais vous avouer que des applications spécifiques de ce modèle sont assez rares, mais ils existent. Un qui me vient à l'esprit est un menu à base de l'application de la console:
do {
char c = read_input();
process_input(c);
} while (c != 'Q');