EL PREPROCESOR DEL C

En el código de un programa se pueden insertar instrucciones que van dirigidas al compilador del C y que no influyen directamente en la lógica del programa. Es lo que se llaman directivas del preprocesor. Todas estas directivas comienzan en la primera columna del archivo fuente y van precedidas del signo #

INCLUDE

Con la directiva #include el preprocesor informa al compilador que debe incluir un archivo en la fuente del que se está editando. El archivo para incluir va entre los signos menor y mayor (<>) o entre comillas ("").

 

  • #include <stdio.h>
    /* Header con path predefinido */

    #define mio_c "C:\DATI\INCLUDE\mio_c.h"
    /* Barra la barra inclinada hacia atrás está permitida aquí. En una instruccion en C se debería poner:
    "\\C:\\DATI\INCLUDE\\mio_c.h" */

    #include mio_c
    /* Macro */

    #include "mio_c.h"

Si en el nombre del archivo a incluir se especifica un "path", dicho archivo solo es buscado en el directorio indicado. Si el nombre del archivo viene entre comillas, dicho archivo es buscado primeramente en el directorio actual. En caso de no encontrarse ahí, continúa la búsqueda en los directorios especificados en la línea de comando. Si aquí sigue sin encontrarse la búsqueda continúa en los directorios estandard definidos por el sistema.
Si no se especifica el "path" y el nombre del archivo que debe ser incluido se encuentra entre los signos menor y mayor (<>), los primeros directorios donde tiene lugar la búsqueda es en los especificados en la línea de comando del compilador. In caso de no hallarse prosigue la búsqueda en el directorio standard. Si sigue sin encontrarse se termina por buscar en directorio activo.

DEFINE

Define un identificador que sustituye a una secuencia de caracteres. Dicho identificador tiene el nombre de macro

 

  • #include <stdio.h>
    #define PI 3.1416
    #define PROMPT "Radio del circulo ? "
    #define FORMATO "Superficie del circulo=%f"
    void main(void)
    {

  • float a,r;
    printf(PROMPT);
    scanf("%f",&r);
    a=PI*r*r;
    printf(FORMATO,a);

    }

Cada vez que el archivo fuente aparece el macro PI se sustituye con el valor 3.1416. Similarmente ocurre con el macro PROMPT y el macro FORMATO

IF, ELSE, ELIF, ENDIF

Estas directivas sirven para indicar al compilador que puede haber secuencias del programa que no deben ser compiladas.
Con las directivas #if y #elif si la expresión que les sigue es verdadera se compilan todas las instrucciones de las líneas a continuación hasta donde se encuentre la directiva #endif.

ERROR

La directiva #error bloquea el compilador. Su aplicación general es en la búsqueda de errores (debugging).

 

  • #if (VALOR !=0 && VALOR !=1)
    #error VALOR debe ser igual a 0 o igual a 1
    #endif

    #define ITALY 0
    #define SPAIN 1
    #define FRENCH 2
    #define COUNTRY SPAIN

    #if COUNTRY==ITALY
    char valuta[]="lira"
    #elif COUNTRY==SPAIN
    char valuta[]="peseta"
    #else
    char valuta[]="franco"
    #endif

IFDEF, IFNDEF

Otro método para la compilación condicionada son las directivas #ifdef e #ifndef, que significan "si está definido", "si no está definido" respectivamente.

Con #ifdef si el nombre del macro ha sido definido anteriormente con una directiva #define, la secuencia de instrucciones que se encuentra entre #ifdef y # endif es compilada.
Con #ifndef si el nombre del macro no ha sido definido por ninguna directiva #define, la secuencia de instrucciones que se encuentra entre #ifdef y # endif es compilada.
Tanto #ifdef como #ifndef pueden incluir una directiva #else pero no #elif.

 

  • #include <stdio.h>
    #define PAVAROTTI
    void main()
    {
    #ifdef PAVAROTTI
    printf("\n Este es Pavarotti");
    #else
    printf("\n Este es cualquier otro");
    #endif
    #ifndef PLACIDO_DOMINGO
    printf("\n Este es Placido Domingo");
    #endif
    }

UNDEF

La directiva #undef permite eliminar a la definición precedente del macro especificado.

 

  • #define LENGTH 100
    char array[LENGTH];

    #undef LENGTH
    /* En estepunto LENGTH no está ya más definido */

PRAGMA

Se trata de una directiva definida en fase de la realización del compilador, que permite enviar al mismo varias instrucciones predefinidas

Donde por nombre se entiende el nombre de una de las directivas que a continuación se dan.

argused

La directiva #pragma argused precede a una función. Impide la emisión de un mensaje de advertencia cuando en el cuerpo de la función falte un argumento.

exit, startup

La directiva exit indica una o mas funciones que son ejecutadas final del programa. La directiva startup especifica una mas funciones que son ejecutadas inicio del programa.

  • #pragma exit Function_name priority
    #pragma startup Function_name priority

Priority (prioridad) es un valor comprendido entre 64 y 255. Los valores comprendidos entre 0 y 63 están reservados. La prioridad determina el orden de llamada de las funciones del mismo tipo. Si no se especifica la prioridad el valor asignado por defecto es 100 (default). Function_name se declara del modo siguiente:

  • void func(void);

 

  • #include <stdio.h>
    void the_begin(void);
    void the_end(void);

    #pragma the_begin(void) 101;
    #pragma the_end(void) 101;
    void main()
    {

  • printf("\n Programa principal ");
    }
  •  
  • void the_begin(void)
    {

  • printf("\n Programa activado");
    }


  • void the_end(void)
    {

  • printf("\n Programa terminado ");
    }
  •  

En este ejemplo el programa visualiza:

  • Programa activado
    Programa principal
    Programa terminado