Eventuali duplicati:
Do-While and if-else statements in C/C++ macrosA cosa serve fare while (0) quando definiamo una macro?
sto leggendo il kernel di Linux e ho trovato molte delle macro come questo:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Perché usano questo piuttosto che definire semplicemente in un {}?
Ma la domanda del PO stand. Perché non solo {(ptr) -> next ...} invece di fare {(ptr) -> next ...} while (0) ;? –
arno ha spiegato che. Si espanderebbe in "{(ptr) -> next ...};" quindi, una dichiarazione seguita da una seconda affermazione. Se la sintassi è comunque "if (espressione) istruzione else statement". Il else non sarebbe associato a nessun se, dal momento che avresti scritto "if (expression) statement statement" (uno "{...}" e uno ";" statement). –
Come ha detto Amo, è un trucco intelligente che consente a una macro di * essere * una dichiarazione C che deve terminare con un punto e virgola. Fa sì che la macro agisca esattamente come una chiamata di funzione, per quanto riguarda la costruzione di istruzioni e la terminazione (con ';'). – Eddie