Conditional inclusion
The preprocessor supports conditional compilation of parts of a source file. This behavior is controlled by #if, #else, #elif, #ifdef, #ifndef and #endif directives.
Contents |
[edit] Syntax
#if expression
|
|||||||||
#ifdef expression
|
|||||||||
#ifndef expression
|
|||||||||
#elif expression
|
|||||||||
#else
|
|||||||||
#endif
|
|||||||||
[edit] Explanation
The conditional preprocessing block starts with #if, #ifdef or #ifndef directive, then optionally includes any number of #elif directives, then optionally includes at most one #else directive and is terminated with the #endif directive. Any inner conditional preprocessing blocks are processed separately.
Each of #if, #elif, #else, #ifdef and #ifndef directives control a code block until the first #elif, #else, #endif directive not belonging to any inner conditional preprocessing blocks.
#if, #ifdef and #ifndef directives test the specified condition (see below), and if it evaluates to true, compiles the controlled code block. In that case subsequent #else and #elif directives are ignored. Otherwise, if the specified condition evaluates false, the controlled code block is skipped and the subsequent #else or #elif directive (if any) is processed. In the former case, the code block controlled by the #else directive is unconditionally compiled. In the latter case, the #elif directive acts as if it were a #if directive: checks for condition, compiles or skips the controlled code block based on the result, and in the latter case processes subsequent #elif and #else directives. The conditional preprocessing block is terminated by the #endif directive.
[edit] Conditional evaluation
[edit] #if, #elif
The expression is a constant expression, using only literals and identifiers, defined using #define directive. Any identifier, which is not literal, non defined using #define directive, evaluates to 0.
The expression may contain unary operators in form defined identifier or defined (identifier) which return 1 if the identifier was defined using
#define directive and 0 otherwise. If the expression evaluates to nonzero value, the controlled code block is included and skipped otherwise. If any used identifier is not a constant, it is replaced with 0.
[edit] #ifdef, #ifndef
Checks if the identifier was defined using #define directive.
#ifdef identifier is essentially equivalent to #if defined( identifier).
#ifndef identifier is essentially equivalent to #if !defined( identifier).
[edit] Example
Output:
1: yes 2: yes 3: yes
[edit] References
- C11 standard (ISO/IEC 9899:2011):
- 6.10.1 Conditional inclusion (p: 162-164)
- C99 standard (ISO/IEC 9899:1999):
- 6.10.1 Conditional inclusion (p: 147-149)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.8.1 Conditional inclusion
[edit] See also
| C++ documentation for Conditional inclusion
|