EL PREPROCESADOR Lenguajes de programación LPSI EUI UPM • Etapa previa a la compilación • Prepara el código fuente para ser compilado • Permite: – Definir constantes y macros – Compilación condicional – Depurar código – Compilación por separado • Todas las directivas (órdenes) del preprocesador empiezan por ‘#’ Lenguajes de programación LPSI EUI UPM DEFINICIÓN DE CONSTANTES #define NOMBRE valor #define PI 3.141559 #define MAX 1000 #define TITULO “Lenguaje C” Lenguajes de programación LPSI EUI UPM DEFINICIÓN DE MACROS • MACRO: operación definida mediante una directiva del preprocesador #define NOMBRE(arg) expresión #define MAYOR (X, Y) (X) > (Y) ? (X): (Y) #define AREA_CIRC (R) PI * (R) * (R) #define PRIM_CAR (CAD) (CAD)[0] * Para continuar la expresión en la siguiente línea: ‘\’ Lenguajes de programación LPSI EUI UPM DEFINICIONES #undef NOMBRE • Anula una definición anterior de constante o macro #undef MAX Lenguajes de programación LPSI EUI UPM COMPILACIÓN CONDICIONAL • Para compilar o no partes del código fuente #if (cond) código #endif #if (1 == COD_MONEDA) #define MONEDA “euro” #endif Lenguajes de programación LPSI EUI UPM COMPILACIÓN CONDICIONAL #if defined (nombre) código #endif #if defined (TIPOS_) #define MAX 7890 #endif Lenguajes de programación LPSI EUI UPM COMPILACIÓN CONDICIONAL #if ! defined (nombre) código #endif #if ! defined (TIPOS_) #define MAX 100 #endif Lenguajes de programación LPSI EUI UPM COMPILACIÓN CONDICIONAL #ifdef (nombre) código #endif #ifdef (TIPOS_) #define MAX 7890 #endif Lenguajes de programación LPSI EUI UPM COMPILACIÓN CONDICIONAL #ifndef (nombre) código #endif #ifndef (TIPOS_) #define MAX 100 #endif Lenguajes de programación LPSI EUI UPM COMPILACIÓN CONDICIONAL #if (cond) código1 #else código2 #endif #if defined (TIPOS_) #define MAX 7890 #else #define MAX 100 #endif Lenguajes de programación LPSI EUI UPM COMPILACIÓN CONDICIONAL #if (cond) código 1 #elif (cond 2) código 2 #elif (cond 3) …………. #else código n #endif Lenguajes de programación LPSI EUI UPM COMPILACIÓN CONDICIONAL #if defined (EUROPA) #define MONEDA “euro” #elif defined (USA) #define MONEDA “dollar” #else #define MONEDA “libra” #endif Lenguajes de programación LPSI EUI UPM COMPILACIÓN POR SEPARADO • Para compilación por separado • Incluye el código contenido en un fichero en otro, normalmente de ficheros cabecera (.h) #include <nombre> #include “nombre” • Con < > se busca el fichero en los directorios especificados por defecto • Con “ “ se busca el fichero en el directorio actual y, si no está, en los especificados por defecto Lenguajes de programación LPSI EUI UPM COMPILACIÓN POR SEPARADO • Ficheros de cabecera: – Extensión .h – Contienen definiciones de constantes, macros, tipos y prototipos de funciones (que se implementan en los correspondientes ficheros de código) • Ficheros de codigo: – Extensión .c – Contienen la implementación de las funciones y del main – Main, normalmente se pone en un fichero de código separado del resto de funciones Lenguajes de programación LPSI EUI UPM COMPILACIÓN POR SEPARADO tipos.h #ifndef TIPOS_H #define TIPOS_H typedef ….. void f1 (int); char f2 (char, char); ……. #endif funciones.c #include <stdio.h> #include “tipos.h” void f1 (int a) { …………. } Char f2 (char c1, char c) prog.c #include <stdio.h> { …………. } #include “tipos.h” int main (void) { …….} Lenguajes de programación LPSI EUI UPM DEPURACIÓN - ASSERT • Macro assert • Definida en assert.h • Usada para depuración de código assert (expresión) • Si la expresión es falsa (0), imprime un mensaje de error, incluyendo el nº de línea del código y el nombre del programa, y aborta la ejecución assert (x <= 10) Lenguajes de programación LPSI EUI UPM