Está en la página 1de 37

Seminario de Lenguajes Opcin C

Clase 4

XO R
BYTE

BIT

10 1 0 001 10 01 1 001

W HILE
HEXA

Seminario de Lenguajes - C

Temario

Repaso de la clase anterior

El Preprocesador

Seminario de Lenguajes - C

Repaso Clase 3

Funciones

Compilacin separada

Funciones de entrada / salida

Seminario de Lenguajes - C

El Preprocesador
Editor

Archivo
Fuente

Archivo
Fuente
Modificado

Compilacin

Pre - Procesador
Seminario de Lenguajes - C

Cdigo
OBJ

.......

Linkedicin

El Preprocesador

Es un elemento del lenguaje C muy utilizado,


que permite dar una respuesta al principio de
modularizacin y compilacin separada que
promueve C.
Las instrucciones normales no afectan
preprocesador, tiene comandos especiales.

archi1.h

archi1.c

al

archi2.h

archi2.c

Seminario de Lenguajes - C

archi3.c

+..
.

Ejecutable

El Preprocesador

Se ejecuta ANTES que la compilacin.

Realiza modificaciones en el archivo fuente.

Inclusin de textos.

Sustituciones.

Eliminar partes del fuente.

Trabaja nicamente con el texto del fuente.


No tiene en cuenta ningn aspecto sintctico ni
semntico del lenguaje.
Seminario de Lenguajes - C

El preprocesador

stdio.h

ejemplo-clase3.c

int getc();

#include <stdio.h>

int putc();

int main(void) {

...

printf(Hola Mundo);

int printf();

Compilador

....

Pre Compilacin
Seminario de Lenguajes - C

Se modifica el cdigo fuente

...

El Preprocesador
Directivas

Una directiva es una palabra que interpreta el


preprocesador.

Comienzan con el smbolo #

Estn situadas a principio de lnea.

Si involucran ms de una lnea se incluye el


carcter \ al final de la lnea
No se utiliza el carcter ; al final de la lnea.
Seminario de Lenguajes - C

El Preprocesador
Directivas

#include
#define
#undef
#if - #else - #ifdef - #ifndef - #elif - #endif
Seminario de Lenguajes - C

El Preprocesador - #include

Garantiza el mismo comportamiento en todo mi


programa.

#include nombre
#include <nombre>
Ejemplo:
#include <stdio.h>
#include ../miDirectorio/libreria.h

Seminario de Lenguajes - C

El Preprocesador

GCC

Cmo compilamos muchos archivos?

gcc -o prog archi1.c archi2.c


Algunas opciones de gcc
-c: realiza preprocesamiento y compilacin,
obteniento el archivo en cdigo objeto
-o archivo: indica el nombre del archivo de salida.
-Wall: muestra todos los mensajes de error y
advertencia del compilador.
-E: slo realiza
preprocesamiento.
Seminario
de Lenguajes - C

El Preprocesador - #define
#define nombre textoDeReemplazo
Sustituye TODAS las ocurrencias de nombre por
textoDeReemplazo.
Permite definir constantes simblicas
Ejemplo:
#define MAX 100
Seminario de Lenguajes - C

En ejecucin
no ocupa un
lugar en la
memoria.

El Preprocesador - #define

El alcance es desde donde se lo declara hasta el


final del archivo fuente.
Las sustituciones se hacen por elementos y no
por cadenas encerradas entre
NO hay que escribir =
En general, el nombre se escribe en maysculas
para diferenciarlas de las variables.

Seminario de Lenguajes - C

El Preprocesador - #define

Errores habituales...
#define MAX =100
if (x == MAX)

if (x == =100)

o
#define MAX 100;
if (x == MAX)

if (x == 100;)

Seminario de Lenguajes - C

El Preprocesador - #define

Errores habituales

#define C A+B
...
D=C*C

A+B*A+B
Forma Correcta
#define C (A+B)
Seminario de Lenguajes - C

El Preprocesador - #define
Permite definir macros parametrizadas

#define absoluto(x) (((x)>=0)?(x) : -(x) )


z= absoluto(a-3);

z= ( ((a-3)>=0 )?(a-3):-(a-3));
En C99 pasan a Seminario
llamarsedefunciones
Lenguajes - inline
C

El Preprocesador - #define

Para tener en cuenta....

#define absoluto(x) ( ((x)>=0)?(x) : -(x) )

z= absoluto(a++)

z= ((a++>=0)?(a++):-(a++) )
Cuntas veces se incrementa a?
Seminario de Lenguajes - C

Actividad para la Wiki


En Grupo

Codificar el ejemplo anterior


Compilarlo con la opcin E qu valores
obtengo?
Probarlo con distintas cantidades, cul es el
resultado?
Escribir el cdigo y los resultados obtenidos en
la wiki de la ctedra.

Seminario de Lenguajes - C

El Preprocesador - #define
Para tener en cuenta....

#define swap(x,y) {int temp=x; x=y; y=temp;}


...
if (a>b)
swap(a,b)
dnde podra estar el problema
else
con este cdigo?
.....
Seminario de Lenguajes - C

El Preprocesador - #define
Para tener en cuenta....
#define DOS 2
#define Doble(x) (DOS*(x))
#define Cuadruple(x) (Doble(Doble(x)))
z=(Doble(Doble(A)));
....
z=((DOS*(Doble(A))));
z=Cuadruple(A);
z=((DOS*((DOS*(A)))));
z=((2*(DOS*(A)))));
Seminario de Lenguajes - C
z=((2*(( 2*(A)))));

El Preprocesador - #define
Macros Recursivas
#define X Y
#define Y Z
#define Z X
....
A=X;

A=Y;
A=Z;
A=X;
Seminario de Lenguajes - C

El Preprocesador - #define
Macros Recursivas

Ejemplo
#define sqrt(x) ((x)>0?sqrt(x):0)
sqrt es una funcin para calcular la raz
cuadrada de un nmero definida en math.c
Sin embargo esta macro permite trabajar con
races cuadradas con nmeros negativos.
Seminario de Lenguajes - C

El Preprocesador - #define
Macros predefinidas
__FILE__: Es una cadena de caracteres que
contiene el nombre del archivo fuente
__LINE__: El nmero de lnea actual
__DATE__: fecha de compilacin
__TIME__: hora de la compilacin
__STDC__: 1, si compila ANSI C
Seminario de Lenguajes - C

El Preprocesador - #define
Operadores de Macros
#: Si x es un parmetro de una macro, #x es el
parmetro actual correspondiente representado como
una cadena de caracteres.
Ejemplo
#define comoString(x)

#x

comoString(3) --> 3
comoString(a-b) -->a-b
comoString(3) -->\3\
Seminario de Lenguajes - C

El Preprocesador - #define

Operadores de Macros

##: Se aplica cuando se procesa la macro y se


reemplazan los parmetros formales por los actuales.
Los dos elementos que rodean al operador, se
combinan.
Ejemplo a + b##c

--> a + bc

#define concatenar(a,b) a##b


...
concatenar(seminario, C);
Seminario de Lenguajes - C

Ver Ejemplo: directivas.pdf

El Preprocesador - #define
Forzando un llamado a funcin ...
Veamos el siguiente ejemplo...

Seminario de Lenguajes - C

El Preprocesador - #define
#define vs. const
const int MAX = 100;
#define MAX 100

Seminario de Lenguajes - C

El Preprocesador - #define
#undef
Permite dejar sin efecto un define previo
#define MAX 12
..
#undef MAX
#define MAX 11

Seminario de Lenguajes - C

El Preprocesador - #if-#else..
Compilacin condicional
El preprocesador permite incorporar o eliminar
sentencias de un cdigo fuente segn la evaluacin de
una expresin.
Directivas
#if - #else - #ifdef - #ifndef - #elif - #endif
#if defined(MAX)
....
#ifdef MAX
.....
Seminario de Lenguajes - C

El Preprocesador - #if-#else..
#include <stdio.h>
define MAX 100
int main(viod) {
#if MAX>99

Se evala en compilacin, entonces la


expresin no puede contener variables.

printf(Compilado para arrays mayores a 99);


#endif;
return 0;
}
Seminario de Lenguajes - C

El Preprocesador - #if-#else..
Compilacin condicional

Usos
#ifdef DEBUG
....sentencias a testear...
#endif
Seminario de Lenguajes - C

Un ejemplo para resolver


#define ARG 0
#define GB 1
#define ESP 2
#define PAIS_ACTIVO ESP
#if PAIS_ACTIVO == ARG
char moneda[] = pesos;
#elif PAIS_ACTIVO == GB
char moneda[] = libras;
#ese
char moneda[] = euro;
#endif

Seminario de Lenguajes - C

El Preprocesador - #ifdef#ifndef..
Compilacin condicional
Para verificar si definido o no definido

Usos
#ifndef _HEADER
#define _HEADER
#ifndef MAX
#define MAX 100
#endif
#endif
Seminario de Lenguajes - C

Un ejemplo
#define MARA
int main(void) {
#ifdef MARA
printf(Hola Mara);
#else
printf(Hola!);
#endif
#ifndef ALEJO
printf(Alejo no ha sido definido);
#endif
return 0;
}

Seminario de Lenguajes - C

El Preprocesador
Pensar...Son correctas?
Definir la siguiente macro:

#define inc #include<stdio.h>


inc
Incluir la siguiente linea en archi.c

#include archi.c
Seminario de Lenguajes - C

El Preprocesador
La opcin -D

gcc -o prog -DLINUX archi1.c


#include <stdio.h>
#ifdef LINUX
#define MENSAJE "Estamos en Linux"
#else
#define MENSAJE "NO estamos en Linux"
#endif
int main(void){
printf(MENSAJE);
}
Seminario de Lenguajes - C

GCC

El Preprocesador

GCC

La opcin -D

gcc -o prog -DMAX=10 archi1.c


....
#undef MAX

Seminario de Lenguajes - C

También podría gustarte