Quelle est l'utilité de faire quand (0) quand on définit une macro?



0 Answers

Il vous permet de regrouper plusieurs instructions en une seule macro.

Supposons que vous avez fait quelque chose comme:

if (foo) 
    INIT_LIST_HEAD(bar);

Si la macro était définie sans encapsuler do {...} while (0) ;, le code ci-dessus s'étendrait à

if (foo)
    (bar)->next = (bar);
    (bar)->prev = (bar);

Ce n'est clairement pas ce qui était prévu, car seule la première déclaration sera exécutée si foo tient. La deuxième déclaration serait exécutée indépendamment du fait que foo soit valide.

Edit: Plus d'explications sur http://c-faq.com/cpp/multistmt.html et http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon

Question

Dupliquer possible:
Instructions Do-While et if-else dans les macros C / C ++

Je lis le noyau Linux et j'ai trouvé beaucoup de macros comme ceci:

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)

Pourquoi utilisent-ils cela plutôt que de le définir simplement dans un {}?




Related