An attempt to use an undefined identifier may elicit a warning from the preprocessor. Or it may not; the preprocessor may simply assume that the
undefined token has a value of 0.
Therefore macro identifiers should not be used in preprocessor directives until after they have been defined, and this limited usage should be
enforced with the use of definition tests.
Noncompliant code example
#if x > 0 /* x assumed to be zero if not defined */
#include SOMETHING_IMPORTANT
#endif
#ifdef y /* Okay; y is not evaluated */
#if y > 0 /* Okay; y must be defined to reach this point */
...
#endif
#endif
Compliant solution
#define x 10
...
#if x > 0
#include SOMETHING_IMPORTANT
#endif
#if defined ( y ) && ( y > 0 ) /* more compact form, same result as before */
...
#endif