319 votes

{...} while (0) — qu’est-ce bon pour ?

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?

469voto

Greg Hewgill Points 356191

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
    ....

106voto

Jere.Jones Points 5394

C’est une façon de simplifier la vérification d’erreur et d’éviter profondément imbriquée if. Par exemple :

78voto

Martin v. Löwis Points 61768

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.

18voto

ubuntu-fanboy Points 61

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) :

-4voto

Daniel Spiewak Points 30706

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');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X