2013-06-28 3 views
3

Quelle est la raison de définir macro cette façon:Pourquoi la macro est-elle déclarée de cette façon?

#define test_errno(msg) do{if (errno) {perror(msg); exit(EXIT_FAILURE);}} while(0) 

Je veux dire quelle est la raison derrière do{}while(0)? Bien sûr, il sera fait une seule fois, zéro est constant, ne peut pas changer à non nul en quelque sorte, alors pourquoi utiliser une telle construction?

Répondre

3

Il permet des choses comme

if (condition) 
    test_errno(...); 

pour fonctionner correctement avec ou sans bretelles.

+1

un ''' manquant. la macro considère cela et elle a besoin d'une fin ';', donc cela ressemble à une vraie fonction. – vvy

2

Il n'y a pas de bonnes raisons dans ce cas. Dans des constructions similaires, il est utile que les instructions à l'intérieur aient continue et break pour faire des choses utiles.

#define test_errno(msg) do {if (cond1) break; \ 
          if (cond2) break; \ 
          if (cond3) break; \ 
       do_something_if_all_condtions_met();} while(0) 
Questions connexes