do {...} while (0) - de quoi est-il bon? [dupliquer]

possibilité de dupliquer:

Pourquoi y a-t-il parfois des énoncés de do/while et if/else dans les macros c/c++?

je vois cette expression depuis plus de 10 ans maintenant. J'ai essayé de réfléchir à ce que c'est bon pour. Puisque je le vois principalement dans #definit, je suppose que c'est bon pour la déclaration de la variable scope interne et pour l'utilisation de breaks (au lieu de gotos.)

est-il bon pour autre chose? L'utilisez-vous?

271
demandé sur Community 2008-11-03 00:36:17
la source

5 ответов

C'est la seule construction en C que vous pouvez utiliser pour #define une opération à plusieurs États, mettre un point-virgule après, et toujours utiliser dans une déclaration if . Un exemple pourrait être utile:

#define FOO(x) foo(x); bar(x)

if (condition)
    FOO(x);
else // syntax error here
    ...;

même en utilisant des bretelles n'aide pas:

#define FOO(x) { foo(x); bar(x); }

utiliser ceci dans une instruction if exigerait que vous omettiez le point-virgule, 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)

la syntaxe suivante est correcte:

if (condition)
    FOO(x);
else
    ....
403
répondu Greg Hewgill 2008-11-03 12:24:33
la source

c'est un moyen de simplifier la vérification des erreurs et d'éviter les if imbriquées. Par exemple:

do {
  // do something
  if (error) {
    break;
  }
  // do something else
  if (error) {
    break;
  }
  // etc..
} while (0);
89
répondu Jere.Jones 2008-11-03 02:48:54
la source

il aide à grouper plusieurs énoncés en un seul, de sorte qu'une macro semblable à une fonction puisse réellement être utilisée comme une fonction. Supposons que vous ayez

#define FOO(n)   foo(n);bar(n)

et vous faites

void foobar(int n){
  if (n)
     FOO(n);
}

puis ça se répand en

void foobar(int n){
  if (n)
     foo(n);bar(n);
}

notez que le second appel (bar(n)) ne fait plus partie de la déclaration if.

Envelopper à la fois en do{}while(0), et vous pouvez également utiliser la macro dans une instruction if.

64
répondu Martin v. Löwis 2008-11-03 00:39:51
la source

en général, do / while est bon pour toute sorte de construction de boucle où l'on doit exécuter la boucle au moins une fois. Il est possible d'imiter ce type de boucle à travers soit une boucle droite while ou même for , mais souvent le résultat est un peu moins élégant. J'admets que les applications spécifiques de ce modèle sont assez rares, mais elles existent. Une qui vient à l'esprit est une application de console basée sur le menu:

do {
    char c = read_input();

    process_input(c);
} while (c != 'Q');
-4
répondu Daniel Spiewak 2008-11-03 00:39:02
la source

Autres questions sur c loops