2009-05-29 15 views

Odpowiedz

131

Możesz śledzić go średnikiem i sprawiać, że wygląda i działa bardziej jak funkcja. Działa również z klauzulą ​​if, jeśli jest to prawidłowe.

Bez czas (0) Twój kod powyżej nie będzie działać z

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

ponieważ średnik po makro będzie „jeść” klauzuli innego, a wyżej nawet nie skompilować.

+5

Ale pytanie OP stoi. Dlaczego nie tylko {(ptr) -> następny ...} zamiast robić {(ptr) -> następny ...} podczas gdy (0) ;? –

+26

wyjaśnił to arno. Rozszerzy się do "{(ptr) -> dalej ...};" tak więc oświadczenie, po którym następuje drugie zdanie. Jeśli jednak składnią jest instrukcja "if (wyrażenie) else". Innego nie kojarzysz z żadnym, jeśli napisałbyś instrukcję "if (wyrażenie)" (jedna "{...}" i jedna ";" instrukcja). –

+3

Jak powiedział Amo, jest to sprytna sztuczka, która umożliwia makro * być * stwierdzeniem C, które musi kończyć się średnikiem. To sprawia, że ​​makro działa dokładnie tak samo jak wywołanie funkcji, jeśli chodzi o konstruowanie i kończenie instrukcji (z ";"). – Eddie

41

Umożliwia grupowanie kilku instrukcji w jedno makro.

Załóżmy, że zrobił coś takiego:

if (foo) 
    INIT_LIST_HEAD(bar); 

Jeśli makro zostało zdefiniowane bez kapsułkujące zrobić {...} while (0) ;, powyższy kod rozwinie się do

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

Oczywiście nie jest to zgodne z zamierzeniem, ponieważ tylko pierwsza instrukcja zostanie wykonana, jeśli zostanie zatrzymany. Druga instrukcja zostanie wykonana niezależnie od tego, czy foo jest wstrzymane.

Edit: Dalsze wyjaśnienia na http://c-faq.com/cpp/multistmt.html i http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon

+7

To nie wyjaśnia części "do .. while (0)", tylko użycie nawiasów klamrowych {}. – SPWorley

+0

do {} while (0) część wyjaśniona jest w tym poście jest dup. – adobriyan

+1

SPWorley, adobriyan: Właściwie to wygląda tak, jak autor tego wpisu dodał linki wyjaśniające działanie do {} while (0). – Jamer