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


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 {}?






Links