2009-05-29 9 views

Respuesta

131

Puede seguirlo con un punto y coma y hacerlo ver y actuar más como una función. También funciona correctamente con las cláusulas if/else.

Sin el tiempo (0), el código anterior no quiere trabajar con

if (doit) 
    INIT_LIST_HEAD(x); 
else 
    displayError(x); 

desde el punto y coma después de la macro sería "comer" la cláusula de los demás, y lo anterior no sería ni siquiera compilar.

+5

Pero la pregunta del OP se encuentra. ¿Por qué no simplemente {(ptr) -> next ...} en lugar de do {(ptr) -> next ...} while (0) ;? –

+26

arno explicó eso. Se expandiría a "{(ptr) -> next ...};" por lo tanto, una declaración seguida de una segunda declaración. Sin embargo, la sintaxis es "if (expression) statement else statement". El resto no estaría asociado con ningún if, ya que habría escrito "if (expression) statement statement" (uno "{...}" y un ";" statement). –

+3

Como dijo Amo, es un truco ingenioso que permite que una macro * sea * una declaración en C que debe terminar con un punto y coma. Hace que la macro actúe exactamente como una llamada a función, en lo que concierne a la construcción y terminación de sentencias (con ';'). – Eddie

41

Le permite agrupar varias declaraciones en una macro.

Supongamos que usted hizo algo como:

if (foo) 
    INIT_LIST_HEAD(bar); 

Si la macro se definió sin el encapsulamiento do {...} while (0) ;, el código anterior se expandiría para

if (foo) 
    (bar)->next = (bar); 
    (bar)->prev = (bar); 

Claramente, esto no es lo que se pretendía, ya que solo la primera declaración se ejecutará si se cumple. La segunda declaración se ejecutará independientemente de si foo se mantiene.

Editar: Una explicación más detallada en http://c-faq.com/cpp/multistmt.html y http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon

+7

Esto no explica la parte .. mientras (0) parte de la macro, solo el uso de {} llaves. – SPWorley

+0

do {} while (0) parte se explica en la publicación, esta es dup de. – adobriyan

+1

SPWorley, adobriyan: En realidad, parece que el autor de esta publicación agregó enlaces que explican el do {} mientras que (0). – Jamer

Cuestiones relacionadas