Normally, when you write multi-line macros, you express them as a while loop.
Code:
#define assert(cond) do { \
if(!(cond)) \
printf("assertion failed for condition %s\n",#cond); \
} while ( 0 ) /* trailing ; is deliberately omitted */
When used in something like this
Code:
if(x == 0)
assert(x<100);
else
printf("No assert call\n");
it has the effect of making it seem to the outer level if statement that the assert is a single statement, and the else will bind to the obviously intended if (and NOT the if now buried inside a while loop).