Hp06 El Preprocesador

Anuncio
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();
}
Descargar