#ifdef
, #else
y
#endif
En la sección 14.11.2 hemos visto como
el preprocesador mantiene un conjunto símbolos definidos, y algunos de ellos
deben ser sustituidos por sus valores equivalentes. El preprocesador también
ofrece un mecanismo por el que una porción de código de un programa se puede
ocultar o considerar dependiendo del valor de alguno de los símbolos
definidos con la directiva #define
. La estructura de esta
construcción es la siguiente:
#ifdef SIMBOLO
/* Bloque de código 1 */
...
#else
/* Bloque de código 2 */
#endif
Cuando el preprocesador encuentra la primera directiva
#ifdef SIMBOLO
, si SIMBOLO
está definido, pasa el
bloque de código 1 al compilador (hasta la directiva #else
) y
elimina el bloque de código 2 (entre las directivas #else
y
#endif
. De forma análoga, si SIMBOLO
no está
definido, el bloque de código 1 se elimina y el compilador sólo recibe el
bloque de código 2. Esta construcción es similar al
if/then/else
en C, pero la diferencia es que esta la interpreta
el preprocesador cuando se compila. La diferencia está en que si el bloque
de código que se ignora contiene un error de sintaxis, el compilador
generará el programa igualmente, pues no llega a procesar ese código.
Esta directiva se utiliza cuando se quiere mantener dos
versiones de un programa que se diferencian únicamente en un reducido número
de líneas de código. Las dos versiones pueden coexistir en el código fuente
pero rodeadas de esta directiva. Al compilar se utiliza entonces la opción
-Dnombre=valor
para seleccionar los bloques de código
pertinentes y generar el ejecutable.
El siguiente ejemplo muestra el uso de esta directiva para
escribir dos versiones de un mensaje de bienvenida a un sistema con dos
posibles versiones. Si el símbolo MAEMO
está definido (por
ejemplo al compilar gcc -DMAEMO ...) al ejecutar se
imprime un mensaje, y si no está definido este símbolo, se imprime un
mensaje alternativo.
#ifdef MAEMO
printf("Bienvenido al sistema Maemo\n"); /* Código para la versión MAEMO */
#else
printf("Bienvenido al otro sistema\n"); /* Código para la otra versión */
#endif