Possibili duplicati:
What’s the use of do while(0) when we define a macro?
Why are there sometimes meaningless do/while and if/else statements in C/C++ macros?
C multi-line macro: do/while(0) vs scope blockCosa fa "do {...} while (0)" esattamente nel codice del kernel?
ho visto un sacco di usi come questo, in precedenza ho pensato che il programmatore ha voluto uscire da un blocco di codice facilmente. Perché abbiamo bisogno di un ciclo do {...} while (0) qui? Stiamo cercando di dire qualcosa al compilatore?
Per esempio nel kernel Linux 2.6.25, include/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)
Penso che tu abbia ragione. Questo crea il blocco da cui puoi uscire. Inoltre crea un altro frame nello stack, ma nella maggior parte dei casi verrà semplicemente ottimizzato. Per ulteriori indizi date un'occhiata alle definizioni di ia64_ * Potrebbero essere macro che hanno dichiarazioni di rottura o qualche altro tipo di presa in giro. – Vlad
http://stackoverflow.com/questions/1067226/c-multi-line-macro-do-while0-vs-scope-block –
O li fai tutti o non ne fai nessuno –