Algoritmos y Lenguaje de Programación, Sección 1 El preprocesador El preprocesador Mario Medina C. [email protected] • Realiza manipulaciones al texto del programa antes de compilarlo )Borra los comentarios )Inserta los archivos de inclusión )Reemplaza macros )Compilación condicional Constantes #define • __FILE__: nombre del archivo siendo compilado • __LINE__: Línea siendo compilada • __DATE__: Fecha de compilación • Reemplaza un texto por otro • Usado para definir constantes )“May 31 2006” • __TIME__: Hora de compilación )“18:40:35” #define nombre texto • Ejemplos: #define #define #define #define MAXIMO 24 complejo struct complex lazoInfinito for(;;) CASE break;case #define #define con argumentos • Ejemplo: • Llamado también macro #define DEBUG_PRINT printf(“x = %x” \ “y = %y\n”, x, y) )No lleva signo = ni ; final x = 2*x; y += x; DEBUG_PRINT; ©Mario Medina C. #define CUADRADO(x) x*x • Puede causar problemas! )CUADRADO(6 + 7) equivalente a 6 +7*6 + 7 )Mejor usar #define CUADRADO(x) (x)*(x) 1 Algoritmos y Lenguaje de Programación, Sección 1 Macros con argumentos Macros con argumentos • Otro ejemplo • Otro ejemplo #define DOBLE(x) x+x • Puede causar problemas! )10*DOBLE(5) equivalente a 10*5+5 )Mejor usar #define DOBLE(x) ((x)+(x)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) x = 5; y = 8; z = MAX(x++, y++); printf(“%d %d %d\n”, x, y, z); Operador # Operador ## • El operador # antes del argumento de una macro crea una ristra con éste • El operador ## une los argumentos anterior y siguiente de la macro • Ejemplo #define STR(x) #x Convierte a STR(prueba) en “prueba” • Ejemplo #define printint(var) \ printf(#var “= %i\n”, var) printint(count); se convierte en printf(“count” “= %i\n”, count); #define printx(n) printf(“%i\n”, x##n) Une los argumentos x y n printx(20); se convierte en printf(“%i\n”, x20); Macros ó funciones? Compilación condicional • Macros pueden realizar computaciones simples • Control de la compilación dependiendo de valores de expresiones )Macros mas rápidas que funciones ` No requieren paso de parámetros vía la pila )Macros aumentan el tamaño del código )Macros no definen el tipo del argumento ` Muchas funciones del sistema están implementadas vía macros )Convención: nombres de macros en MAYUSCULAS ©Mario Medina C. #if expresion codigo #endif • Preprocesador evalúa expresión )Expresión debe ser constante o #define 2 Algoritmos y Lenguaje de Programación, Sección 1 Compilación condicional Compilación condicional • Ejemplo • Control de la compilación dependiendo de símbolos previamente definidos #if DEBUG printf(“x = %x, y = %y\n”, x, y); #elif . . . . #endif • Compilación controlada por valor de DEBUG #define DEBUG 1 Compilación condicional #ifdef LINUX #if defined(REDHAT) codigo_para_REDHAT; #endif #if defined(SUSE) codigo_para_SUSE; #endif #endif #ifdef SIMBOLO codigo #endif )También puede usarse #if defined(SIMBOLO) #ifndef SIMBOLO #if !defined(SIMBOLO) Definición de símbolos • Ejemplo anterior depende de si símbolo LINUX está definido )Definir con #define #define LINUX • Definir al momento de compilar )Opción –D al compilador gcc gcc –D LINUX tarea1.c Inclusión de encabezados Inclusión anidada • Incluye archivos de declaraciones • Incluir archivos de declaraciones sólo una vez )Preprocesador lee el archivo y lo incluye en el código fuente #include <stdio.h> #include “misfunciones.h” )Archivos de encabezado generalmente usan extensión .h ` Uso de < y > indica archivo del sistema ` Uso de “” indica archivo del usuario ©Mario Medina C. )En archivo de encabezado, definir un símbolo único para este proyecto #ifndef _MIARCHIVO_H_ #define _MIARCHIVO_H_ . . . #endif 3