Можно создать дубликат:
Do-While and if-else statements in C/C++ macrosЧто нужно делать во время (0), когда мы определяем макрос?
Я читаю ядро и я нашел много макросов, как это:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Почему они используют это, а не определять это просто в {}?
Но вопрос в OP остается в силе. Почему не просто {(ptr) -> next ...} вместо do {(ptr) -> next ...} while (0) ;? –
arno объяснил это. Он будет расширяться до «{(ptr) -> next ...};" таким образом, заявление, за которым следует второе утверждение. Если синтаксис, однако, есть выражение if (expression) statement else ". Друг не будет связан с каким-либо, если бы вы написали оператор выражения if (expression) "(один" {...} "и один оператор"; "). –
Как сказал Амо, это умный трюк, позволяющий макросу * быть * выражением C, который должен заканчиваться точкой с запятой. Это делает макрос действовать точно так же, как вызов функции, если речь идет о построении и завершении оператора (с ';'). – Eddie