Title: do while(0)


Note that the do loop in the macro ends with "while(0)". Therefore, this loop will execute only once.

Here is an explanation of this construct (from Steve Summit - scs@eskimo.com):

10.4:       What's the best way to write a multi-statement macro?


A:       The usual goal is to write a macro that can be invoked as if it
       were a statement consisting of a single function call. This
       means that the "caller" will be supplying the final semicolon,
       so the macro body should not. The macro body cannot therefore
       be a simple brace-enclosed compound statement, because syntax
       errors would result if it were invoked (apparently as a single
       statement, but with a resultant extra semicolon) as the if
       branch of an if/else statement with an explicit else clause.

       The traditional solution, therefore, is to use

              #define MACRO(arg1, arg2) do {       \
                     /* declarations */       \
                     stmt1;                     \
                     stmt2;                     \
                     /* ... */              \
                     } while(0)       /* (no trailing ; ) */

       When the caller appends a semicolon, this expansion becomes a
       single statement regardless of context. (An optimizing compiler
       will remove any "dead" tests or branches on the constant
       condition 0, although lint may complain.)