Consider if( something ) function1(); else function2();
If function1()
is actually a macro, just using { }
requires you to omit the semicolon at the point of use, but do { } while(0)
lets you use exactly the same syntax as for a real function.
(Not using any kind of block construct at all would just generate completely broken code, natch)