Возможные дубликаты:
Что нужно использовать во время (0), когда мы определяем макрос?
Почему иногда существуют бессмысленные операторы do/while и if/else в макросах C/С++?
C многострочный макрос: do/while (0) vs scope block
Я видел много таких способов, как это, ранее я, хотя программист хотел легко выйти из блока кода. Зачем нам нужен цикл {...} while (0)? Мы пытаемся что-то сказать компилятору?
Например, в ядре 2.6.25 Linux включите /asm -ia64/system.h
/*
* - clearing psr.i is implicitly serialized (visible by next insn)
* - setting psr.i requires data serialization
* - we need a stop-bit before reading PSR because we sometimes
* write a floating-point register right before reading the PSR
* and that writes to PSR.mfl
*/
#define __local_irq_save(x) \
do { \
ia64_stop(); \
(x) = ia64_getreg(_IA64_REG_PSR); \
ia64_stop(); \
ia64_rsm(IA64_PSR_I); \
} while (0)