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 código fuente sea compilado. El preprocesador produce un programa escrito en C, que es lo que se compila después. Deben empezar con el símbolo "#" 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 librería. También se usa para incluir ficheros fuente. Con las comillas, se busca primero en el directorio actual y después, si falla, se busca en los lugares estándar. Con "<>" se busca sólo en los lugares estándar ("/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 simbólicas y macros (refinamiento sintáctico). No puede haber separación entre el nombre de la macro y el paréntesis izquierdo cuando hay lista de parámetros. Los parámetros se ponen entre paréntesis para protegerse contra la expansión que pueda conducir a un orden de evaluación 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 compilación condicional del texto que sigue hasta encontrar una directiva "#endif". Una constante restringida no puede contener "sizeof", "casts" ni constantes de enumeración. Se verifica que no sea cero. Después de "#ifdef", el identificador debe estar definido por un "#define" activo. Después 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 líneas, 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 diagnóstico incluyendo ese texto. #pragma #pragma texto Sirve para pasar información no estándar al compilador (directivas de optimización, 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 número de línea 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 estándar. __TIME__ Se expande a una cadena literal que devuelve el instante en el que se llama al traductor. Pag. 4