Doublons possibles:
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 blockQue fait exactement "do {...} while (0)" dans le code du noyau?
J'ai vu beaucoup d'usages comme celui-ci, auparavant je pensais que le programmeur a voulu sortir d'un bloc de code facilement. Pourquoi avons-nous besoin d'une boucle do {...} while (0) ici? Essayons-nous de dire quelque chose au compilateur?
Par exemple, dans le noyau 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)
Je pense que vous avez raison. Cela crée le bloc dont vous pouvez sortir. En outre, il crée un autre cadre sur la pile, mais dans la plupart des cas, il sera simplement optimisé. Pour plus d'indices, jetez un oeil aux définitions de ia64_ * Il pourrait s'agir de macros qui ont des instructions break ou d'autres types de moquerie. – Vlad
http://stackoverflow.com/questions/1067226/c-multi-line-macro-do-while0-vs-scope-block –
Vous les faites tous ou vous n'en faites aucun –