Q:  I thought that an #if 0 block will ignore everything inside it.  But it doesn't.

A:  The ANSI standard says that #if statements only ignore syntactically correct code.  So if there are syntax errors, you get an error.  Two particularly nasty ones are unterminated comments, and unterminated string constants.  See examples below.

/tmp/foo.c contains:

#ifdef NEVER
/* this is the start of
a comment that never ends
#endif

/lib/cpp /tmp/foo.c generates:

/tmp/foo.c:1: unterminated '#if' conditional

Or, /tmp/foo.c contains:

#ifdef NEVER
some words with a single quote ' OK
#endif

it generates:

/tmp/foo.c:2: unterminated string constant
/tmp/foo.c:1: unterminated #if conditional

Note: In 3.0 or 3.1, the error generated reads:

/tmp/foo.c:2: unterminated character constant

QA454

Valid for 1.0, 2.0, 3.0