El preprocesador

Anuncio
Algoritmos y Lenguaje de Programación,
Sección 1
El preprocesador
El preprocesador
Mario Medina C.
mariomedina@udec.cl
• 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
Descargar