What's the use of do while(0) when we define a macro?

amazingjxq picture amazingjxq · May 29, 2009 · Viewed 51.4k times · Source

Possible Duplicates:
Do-While and if-else statements in C/C++ macros
do { … } while (0) — what is it good for?

I'm reading the linux kernel and I found many macros like this:

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

Why do they use this rather than define it simply in a {}?

Answer

SPWorley picture SPWorley · May 29, 2009

You can follow it with a semicolon and make it look and act more like a function. It also works with if/else clauses properly then.

Without the while(0), your code above would not work with

if (doit) 
   INIT_LIST_HEAD(x);
 else 
   displayError(x);

since the semicolon after the macro would "eat" the else clause, and the above wouldn't even compile.