UC3M

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

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

14.11.2. La directiva #define

La directiva #define tiene dos versiones. Si va seguida de una única cadena de texto como por ejemplo

#define SISTEMA_MAEMO

el preprocesador simplemente anota internamente que este símbolo está definido. En la sección 14.11.3 veremos otra directiva para consultar qué símbolos están definidos.

La segunda versión de esta directiva es cuando va seguida de dos cadenas de texto. En este caso, a partir de ese punto, el preprocesador reemplaza toda aparición de la primera cadena por la segunda. El siguiente ejemplo define el símbolo CARGA_MAXIMA para que se reemplace por el valor 1500.

#define CARGA_MAXIMA 1500

El efecto de esta directiva es idéntico al uso de la opción -D del compilador. En realidad, cuando se invoca el compilador con la opción -Dnombre=valor, esta definición es equivalente a que el procesador encontrase la línea #define nombre valor.

Con la directiva #define debes tener en cuenta lo siguiente:

  • Esta directiva suele estar al comienzo de los ficheros de código, o si se necesitan en varios ficheros, en un fichero de definiciones con extensión .h que se incluye en otros ficheros.

  • Para diferenciar en el código los símbolos normales de un programa de aquellos que han sido definidos por la directiva #define y que van a ser reemplazados por sus equivalentes por el preprocesador, estos últimos se suelen escribir siempre con mayúsculas (esto es una convención, el preprocesador no realiza ningún tipo de comprobación).

  • El reemplazo del símbolo por su valor se realiza en todo el texto de un fichero. Esto incluye también las propias directivas del preprocesador. En el siguiente ejemplo

    #define UNO 1
    #define OTRO_UNO UNO
    
    int main(argc, char *argv[]) 
    {
        printf("%d\n", OTRO_UNO);
    }

    el programa imprime el número uno. Es decir, la segunda directiva #define se procesa como #define OTRO_UNO 1 al reemplazarse UNO por la definición de la línea anterior.