Todas las directivas
condicionales deben completarse dentro del mismo fichero. Sólo
se compilarán las líneas que estén dentro de
las secciones que cumplan la condición de la expresión
constante correspondiente.
Estas directivas
funcionan de modo similar a los operadores condicionales C++.
Si el resultado de evaluar la expresión constante 1, que
puede ser una macro, es distinto de cero (true), las líneas
representadas por sección-1, ya sean líneas de comandos,
macros o incluso nada, serán compiladas. En caso contrario,
si el resultado de la evaluación de la expresión constante
1, es cero (false), la sección-1 será ignorada, no
se expandirán macros ni se compilará.
En el caso de
ser distinto de cero, después de que la sección-1
sea preprocesada, el control pasa al #endif correspondiente, con
lo que termina la secuencia condicional. En el caso de ser cero,
el control pasa al siguiente línea #elif, si existe, donde
se evaluará la expresión constante 2. Si el resultado
es distinto de cero, se procesrá la sección-2, y después
el control pasa al correspondiente #endif. Por el contrario, si
el resultado de la expresión constante 2 es cero, el control
pasa al siguiente #elif, y así sucesivamente, hasta que se
encuentre un #else o un #endif. El #else, que es opcional, se usa
como una condición alternativa para el caso en que todas
la condiciones anteriores resulten falsas.
El #endif
termina la secuencia condicional.
Cada sección
procesada puede contener a su vez directivas condicionales, anidadas
hasta cualquier nivel, cada #if debe corresponderse con el #endif
más cercano.
El objetivo
de una red de este tipo es que sólo una sección,
inclusive vacía, sea compilada. Las secciones
ignoradas sólo son relevantes para evaluar las condiciones
anidadas, es decir asociar cada #if con su #endif.
Las expresiones
constantes deben poder ser evaluadas como valores enteros.
|