CAPÍTULO 6 EL PREPROCESADOR 6.1. ORDENES DEL PREPROCESADOR Son sentencias cuyo primer caracter debe ser # y permiten realizar las siguientes tareas ü ü ü Realizar sustituciones de símbolos Insertar automáticamente archivos de texto Realizar compilación condicional Estas ordenes facilitan las escritura de programas. Sustitución de símbolos Los símbolos se pueden sustituir por otros o por una constante, para ello se utiliza la siguiente directiva #define NUMERO 100 Descripción #define NUMERO 100 Palabra reservada que introduce la sustitución Símbolo, puede ser cualquier identificador Valor que reemplazará el símbolo Tabla 6.1. Directiva #define. Ej 6.1. Sustitución de símbolos. #define INICIO { #define FIN } #define MENSAJE "HOLA SAPOS\n" #define ENTERO int #define REAL float #define BYTE char #define SUMA (x+y) #define NUM 5 BYTE c[NUM*10]; void main() INICIO ENTERO x=10, y, v; REAL r=0.0; y=NUM; printf(MENSAJE); v=SUMAXY; for(v=0;v<(NUM*10);v++) c[v]=0; FIN void main() { int x=10, y, v; float r=0.0; y=5; printf("HOLA SAPOS\n"); v=x+y; for(v=0;v<50;v++) c[v]=0; } 54 Preparado por Juan Ignacio Huircán Inserción de archivos de código fuente La orden #include inserta un archivo (de código fuente) en el texto de un programa. Formato Descripción #include "nombre_archivo" #include <nombre_archivo> Inserta un archivo que se encuentra en el directorio actual Inserta un archivo que se encuentra localizado en el directorio INCLUDE Tabla 6.2. Formato de la directiva #include. Compilación condicional La compilación condicional permite incluir o excluir código fuente durante el proceso de compilación, esto si ocurren determinadas condiciones. Un ejemplo clásico es la mantención de la portabilidad del programa y pueda ser pasado por diferentes compiladores. La tabla 6.3. muestra las ordenes al preprocesador. Orden #ifdef #ifndef #if #else #elif #endif #undef Descripción Inclusion si el símbolo está definido Inclusión si el símbolo no está definido Inclusión si se cumple una condición Si no else if Final del if Anula la existencia de un símbolo Tabla 6.3. Directivas de compilación Sintaxis para usar las directivas de compilación #if <expresion - constante> #else #endif #if <expresion - constante> #elif <expresion - constante> #endif ü El compilador sólo compila las lineas que siguen a la directiva #if cuando la <expresion- constante> evaluada es distinta de cero. ü El compilador salta las lineas que siguen hasta que encuentra un #else o #endif. ü Si la expresion es evaluada falsa y hay un #else, las lineas entre #else y #endif son compiladas. ü La directiva #if puede ser anidada, pero las directivas #else y el #endif deben estar en el mismo archivo como el #if. Herramientas de programación 55 Para usar #if ... #elif ... #endif #elif es como #else excepto que el bloque else es compilado solo si la expresión después de #elif no es cero. Formas alternativas para #ifdef y #ifndef #ifdef <identificador> Evalua con 1 si el símbolo especificado por <identificador> ha sido previamente definido con la directiva #define. #ifndef <identificador> Evalua con 1 si el símbolo especificado por <identificador> no ha sido definido. Ej 6.2. Ejemplo básico de directivas de compilación #define SIMBOLO 1 void main() { #ifdef SIMBOLO /* Puede(n) ir una(s) declaración(es) o instruccion(es) en C */ #endif #ifdef SIMBOLO /* Puede(n) ir una(s) declaración(es) o instruccion(es) en C #else /* Puede(n) ir una(s) declaración(es) o instruccion(es) en C #endif */ */ } Ej 6.3. Directivas un poco más complejas #if defined(NEARPOINTERS) space = farcoreleft(); #elif defined(FARPOINTERS) space = coreleft(); #else #error Unsupported memory model #endif #ifndef Quiet PrintDiagnostics(); #endif #ifdef DEBUG printf("Total space %d\n", space); #endif 56 Preparado por Juan Ignacio Huircán Ej 6.4. El siguiente programa indica como se pueden utilizar las directivas de compilación. Si está definido el símbolo CONDICION se incluye el código fuente correspondiente, pero además se pregunta si está definido el símbolo CONDI, como no está, sólo se incluira el printf() con formato %f. /* Programa original */ /* Programa compilado */ #include <stdio.h> #include <conio.h> #include <stdio.h> #include <conio.h> #define CONDICION 4 const SAPO=10.0; float resultado; #ifdef CONDICION const SAPO=10.0; float resultado; #endif #ifdef CONDI const SAPO = 8; int resultado; #endif void main() { resultado= SAPO*15; #ifdef CONDI printf("%d",resultado); #else printf("%f", resultado); #endif getch(); } void main() { resultado= SAPO*15; printf("%f", resultado); getch(); }