Conditional Compilation Directives
- 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#eliffalla - La directiva #endif, que finaliza el texto condicional
- 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
#endifdel 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.
#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 */
#endifCada 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.