Conditional Compilation Directives

Una directiva de compilación condicional de preprocesador hace que el preprocesador suprima condicionalmente la compilación de partes del código fuente. Estas directivas prueban una expresión constante o un identificador para determinar qué símbolos debe pasar el preprocesador al compilador y qué símbolos deben omitirse durante el preproceso. Las directivas son:
  • Las directivas #if y #elif, que incluyen o suprimen de forma condicional partes del código fuente, en función del resultado de una expresión constante
  • La directiva #ifdef, que incluye condicionalmente el texto fuente si se define un nombre de macro
  • La directiva #ifndef, que incluye condicionalmente el texto de origen si no se ha definido un nombre de macro
  • La directiva #else, que incluye condicionalmente el texto de origen si la prueba anterior de #if, #ifdef, #ifndefo #elif falla
  • La directiva #endif, que finaliza el texto condicional
La directiva de compilación condicional de preprocesador abarca varias líneas:
  • La línea de especificación de condición (empezando por #if, #ifdefo #ifndef)
  • Líneas que contienen código que el preprocesador pasa al compilador si la condición se evalúa en un valor distinto de cero (opcional)
  • La línea #elif (opcional)
  • Líneas que contienen código que el preprocesador pasa al compilador si la condición se evalúa en un valor distinto de cero (opcional)
  • La línea #else (opcional)
  • Líneas que contienen código que el preprocesador pasa al compilador si la condición se evalúa como cero (opcional)
  • La directiva #endif del preprocesador

Para cada directiva #if, #ifdefy #ifndef , hay cero o más directivas #elif , cero o una directiva #else y una directiva #endif coincidente. Se considera que todas las directivas coincidentes están en el mismo nivel de anidamiento.

Puede anidar directivas de compilación condicional. En las directivas siguientes, el primer #else coincide con la directiva #if .
#ifdef MACNAME
                 /*  tokens added if MACNAME is defined */
#   if TEST <=10
                 /* tokens added if MACNAME is defined and TEST <= 10 */
#   else
                 /* tokens added if MACNAME is defined and TEST >  10 */
#   endif
#else
                 /*  tokens added if MACNAME is not defined */
#endif

Cada directiva controla el bloque inmediatamente después. Un bloque consta de todos los símbolos que empiezan en la línea que sigue a la directiva y que terminan en la siguiente directiva de compilación condicional en el mismo nivel de anidamiento.

Cada directiva se procesa en el orden en el que se encuentra. Si una expresión se evalúa como cero, se ignora el bloque que sigue a la directiva.

Cuando un bloque que sigue a una directiva de preprocesador debe ignorarse, los símbolos se examinan sólo para identificar las directivas de preprocesador dentro de ese bloque de modo que se pueda determinar el nivel de anidamiento condicional. Se ignoran todos los símbolos que no sean el nombre de la directiva.

Sólo se procesa el primer bloque cuya expresión es distinta de cero. Los bloques restantes en ese nivel de anidamiento se ignoran. Si no se ha procesado ninguno de los bloques en ese nivel de anidamiento y hay una directiva #else , se procesa el bloque que sigue a la directiva #else . Si no se ha procesado ninguno de los bloques en ese nivel de anidamiento y no hay ninguna directiva #else , se ignora todo el nivel de anidamiento.