Powiel możliwe:
Do-While and if-else statements in C/C++ macrosDo czego służy funkcja do while (0), gdy definiujemy makro?
Czytam jądro Linux i znalazłem wiele makr tak:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Dlaczego oni to wykorzystać zamiast definiować to po prostu w {}?
Ale pytanie OP stoi. Dlaczego nie tylko {(ptr) -> następny ...} zamiast robić {(ptr) -> następny ...} podczas gdy (0) ;? –
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). –
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