Está en la página 1de 4

Preprocesador de C.

DIRECTIVAS PARA EL PREPROCESADOR DE "C"

#include #define , #undef #if , #ifdef , #ifndef , #elif , #else , #endif #line #error #pragma macros predefinidas: ( __DATE__, __FILE__, __LINE__, __STDC__, __TIME__ )

Son rdenes que el preprocesador interpreta antes de que el cdigo fuente sea compilado. El preprocesador produce un programa escrito en C, que es lo que se compila despus. Deben empezar con el smbolo "#" escrito en la primera columna.

#include #include "fichero" #include <fichero> Ejemplos: #include <stdio.h> #include <math.h>

Se sustituye esa linea por el contenido del fichero. Se emplea para incluir ficheros de cabeceras necesarias para usar las funciones de librera. Tambin se usa para incluir ficheros fuente. Con las comillas, se busca primero en el directorio actual y despus, si falla, se busca en los lugares estndar. Con "<>" se busca slo en los lugares estndar ("/usr/include" en UNIX).

#define #define identificador cadena_de_simbolos #define identificador (identificador, ..., identificador) cadena_de_simbolos #undef identificador Ejemplos: #define #define #define #define #define #define #define #define #define PI 3.14159 E 2.71828 EOF -1 TRUE 1 FALSE 0 MAXINT 21474833647 MAXDIM 200 EQ == SEGUNDOS_AL_DIA (60*60*24)

#define CUAD(x) (( (x) * (x) ) #define CUBO(x) (CUAD(x)*(x)) #define MIN(x,y) ( ((x)<(y)) ? (x) : (y) )

Pag. 1

Preprocesador de C.
Para definir constantes simblicas y macros (refinamiento sintctico). No puede haber separacin entre el nombre de la macro y el parntesis izquierdo cuando hay lista de parmetros. Los parmetros se ponen entre parntesis para protegerse contra la expansin que pueda conducir a un orden de evaluacin indeseado. #define CUAD(x) x*x ... CUAD(a+b) se expande a: a+b*a+b, que es diferente de: ((a+b)*(a+b)) #define CUAD(x) (x)*(x) ... 4/CUAD(2) se expande a: 4/(2)*(2) que es diferente de: 4/((2)*(2))

#if , #ifdef , #ifndef , #elif , #else , #endif #if expresion_constante_restringida #ifdef identificador #ifndef identificador ... #elif expresion_constante_restringida ... #else ... #endif

Permiten la compilacin condicional del texto que sigue hasta encontrar una directiva "#endif". Una constante restringida no puede contener "sizeof", "casts" ni constantes de enumeracin. Se verifica que no sea cero. Despus de "#ifdef", el identificador debe estar definido por un "#define" activo. Despus de "#ifndef", el identificador debe estar indefinido.

Ejemplos:

#if DIECISEIS maximo=32767; #else maximo=21474833647; #endif

#ifdef PRUEBAS printf(...); #endif cc -DPRUEBAS prog.x

Pag. 2

Preprocesador de C.

#ifdef VERSION1 f(a, b, c) /* primera version */ { ... } #else f(a, b, c) /* segunda version */ { ... } #endif

#ifdef VT100 strcpy(borra, "\33[H\33[J"); #elif MACINTOSH strcpy(borra, "\f"); #elif HP strcpy(borra, "\33&a0y0C\33J"); #else leer_secuencia(borra); #endif

#line #line constante "nombre_de_fichero" Hace que el compilador utilice esa constante para numerar las lneas, y ese nombre de fichero en los mensajes que dirige al usuario, en vez de los valores reales. Esos valores son asignados a las macros predefinidas "__FILE__" y "__LINE__".

#error #error texto Ejemplo: #ifndef VERSION #error No se ha especificado la version

El compilador escribe un mensaje de diagnstico incluyendo ese texto.

#pragma #pragma texto Sirve para pasar informacin no estndar al compilador (directivas de optimizacin, por ejemplo).

Pag. 3

Preprocesador de C.

macros predefinidas ( __DATE__, __FILE__, __LINE__, __STDC__, __TIME__ ) __DATE__ Se expande a una cadena literal que da la fecha en que se invoc al traductor. __FILE__ Se expande a una cadena literal que da el nombre del fichero fuente actual. __LINE__ Se expande a una constante decimal entera que indica el nmero de lnea del fichero actual. __STDC__ Se expande a la constante decimal entera "1". El compilador debe suministrar otro valor (o dejarla sin definir) cuando se invoca a la macro para otro entorno que no sea el de C estndar. __TIME__ Se expande a una cadena literal que devuelve el instante en el que se llama al traductor.

Pag. 4