Preprocesador de “C”. Pag. 1

Anuncio
Preprocesador de “C”.
DIRECTIVAS PARA EL PREPROCESADOR DE "C"
#include
#define , #undef
#if , #ifdef , #ifndef , #elif , #else , #endif
#line
#error
#pragma
macros predefinidas:
( __DATE__, __FILE__, __LINE__, __STDC__, __TIME__ )
Son órdenes que el preprocesador interpreta antes de que el código fuente sea compilado.
El preprocesador produce un programa escrito en C, que es lo que se compila después.
Deben empezar con el símbolo "#" escrito en la primera columna.
#include
#include "fichero"
#include <fichero>
Ejemplos:
#include <stdio.h>
#include <math.h>
Se sustituye esa linea por el contenido del fichero. Se emplea para incluir ficheros de cabeceras
necesarias para usar las funciones de librería. También se usa para incluir ficheros fuente.
Con las comillas, se busca primero en el directorio actual y después, si falla, se busca en los
lugares estándar. Con "<>" se busca sólo en los lugares estándar ("/usr/include" en UNIX).
#define
#define identificador cadena_de_simbolos
#define identificador (identificador, ..., identificador) cadena_de_simbolos
#undef identificador
Ejemplos:
#define
#define
#define
#define
#define
#define
#define
#define
#define
PI 3.14159
E 2.71828
EOF -1
TRUE 1
FALSE 0
MAXINT 21474833647
MAXDIM 200
EQ ==
SEGUNDOS_AL_DIA (60*60*24)
#define CUAD(x) (( (x) * (x) )
#define CUBO(x) (CUAD(x)*(x))
#define MIN(x,y) ( ((x)<(y)) ? (x) : (y) )
Pag. 1
Preprocesador de “C”.
Para definir constantes simbólicas y macros (refinamiento sintáctico).
No puede haber separación entre el nombre de la macro y el paréntesis izquierdo cuando hay lista
de parámetros.
Los parámetros se ponen entre paréntesis para protegerse contra la expansión que pueda
conducir a un orden de evaluación indeseado.
#define CUAD(x) x*x
...
CUAD(a+b) se expande a: a+b*a+b,
que es diferente de: ((a+b)*(a+b))
#define CUAD(x) (x)*(x)
...
4/CUAD(2)
se expande a: 4/(2)*(2)
que es diferente de: 4/((2)*(2))
#if , #ifdef , #ifndef , #elif , #else , #endif
#if
expresion_constante_restringida
#ifdef identificador
#ifndef identificador
...
#elif expresion_constante_restringida
...
#else
...
#endif
Permiten la compilación condicional del texto que sigue hasta encontrar una directiva "#endif".
Una constante restringida no puede contener "sizeof", "casts" ni constantes de enumeración. Se
verifica que no sea cero.
Después de "#ifdef", el identificador debe estar definido por un "#define" activo.
Después de "#ifndef", el identificador debe estar indefinido.
Ejemplos:
#if DIECISEIS
maximo=32767;
#else
maximo=21474833647;
#endif
#ifdef PRUEBAS
printf(...);
#endif
cc -DPRUEBAS prog.x
Pag. 2
Preprocesador de “C”.
#ifdef VERSION1
f(a, b, c)
/* primera version */
{
...
}
#else
f(a, b, c)
/* segunda version */
{
...
}
#endif
#ifdef VT100
strcpy(borra, "\33[H\33[J");
#elif MACINTOSH
strcpy(borra, "\f");
#elif HP
strcpy(borra, "\33&a0y0C\33J");
#else
leer_secuencia(borra);
#endif
#line
#line constante "nombre_de_fichero"
Hace que el compilador utilice esa constante para numerar las líneas, y ese nombre de fichero en
los mensajes que dirige al usuario, en vez de los valores reales.
Esos valores son asignados a las macros predefinidas "__FILE__" y "__LINE__".
#error
#error texto
Ejemplo:
#ifndef VERSION
#error No se ha especificado la version
El compilador escribe un mensaje de diagnóstico incluyendo ese texto.
#pragma
#pragma texto
Sirve para pasar información no estándar al compilador (directivas de optimización, por
ejemplo).
Pag. 3
Preprocesador de “C”.
macros predefinidas
( __DATE__, __FILE__, __LINE__, __STDC__, __TIME__ )
__DATE__
Se expande a una cadena literal que da la fecha en que se invocó al traductor.
__FILE__
Se expande a una cadena literal que da el nombre del fichero fuente actual.
__LINE__
Se expande a una constante decimal entera que indica el número de línea del fichero actual.
__STDC__
Se expande a la constante decimal entera "1". El compilador debe suministrar otro valor (o
dejarla sin definir) cuando se invoca a la macro para otro entorno que no sea el de C estándar.
__TIME__
Se expande a una cadena literal que devuelve el instante en el que se llama al traductor.
Pag. 4
Descargar