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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…