One common case of nested conditionals is used to check for more than two possible alternatives. For example, you might have
#if X == 1 … #else /* X != 1 */ #if X == 2 … #else /* X != 2 */ … #endif /* X != 2 */ #endif /* X != 1 */
Another conditional directive, ‘#elif’, allows this to be abbreviated as follows:
#if X == 1 … #elif X == 2 … #else /* X != 2 and X != 1*/ … #endif /* X != 2 and X != 1*/
‘#elif’ stands for “else if”. Like ‘#else’, it goes in the middle of a conditional group and subdivides it; it does not require a matching ‘#endif’ of its own. Like ‘#if’, the ‘#elif’ directive includes an expression to be tested. The text following the ‘#elif’ is processed only if the original ‘#if’-condition failed and the ‘#elif’ condition succeeds.
More than one ‘#elif’ can go in the same conditional group. Then the text after each ‘#elif’ is processed only if the ‘#elif’ condition succeeds after the original ‘#if’ and all previous ‘#elif’ directives within it have failed.
‘#else’ is allowed after any number of ‘#elif’ directives, but ‘#elif’ may not follow ‘#else’.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.2.0/cpp/Elif.html