UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

14.11.3. Las directivas #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