Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Lenguaje de programacion C, Apuntes de Programación C

programando a bajo nivel con lenguaje C

Tipo: Apuntes

2016/2017

Subido el 06/09/2017

agustin-palacios
agustin-palacios 🇦🇷

5

(1)

2 documentos

1 / 16

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
i
i
“Programando*en*C*a*Bajo*Nivel” 2011/6/8 14:41 page 1 #1 i
i
i
i
i
i
Universidad de Buenos Aires
Facultad De Ingenier
´
ıa
Programando en C a Bajo Nivel
[75.40] Algoritmos y Programaci´on I
1er Cuatrimestre 2011
atedra: Ing. Pablo Guarna
Autor: Bernardo Ortega Moncada
Versi´on 3.0
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Vista previa parcial del texto

¡Descarga Lenguaje de programacion C y más Apuntes en PDF de Programación C solo en Docsity!

Universidad de Buenos Aires

Facultad De Ingenier´ıa

Programando en C a Bajo Nivel

[75.40] Algoritmos y Programaci´on I

1er Cuatrimestre 2011

C´atedra: Ing. Pablo Guarna

Autor: Bernardo Ortega Moncada

Versi´on 3.

´Indice

    1. Introducci´on
    1. Representaci´on de N´umeros en Base Binaria
    • 2.1. Complementos A1 de un N´umero
    1. Sentencias Bit a Bit en C
    • 3.1. Operaci´on AND (Bit a Bit) (&)
    • 3.2. Operaci´on OR (Bit a Bit) (|)
    • 3.3. Operaci´on XOR (bit a bit) ( ∧ )
    • 3.4. Operaci´on Complemento A1 a la Base ( ∼ )
    • 3.5. Desplazamiento de Bits
      • 3.5.1. Desplazamiento de Bits a la Derecha ( >> )
      • 3.5.2. Desplazamiento de Bits a la Izquierda ( < < )
    • 3.6. Operador Ternario (? :)
      • 3.6.1. Ejemplo
    • 3.7. Campos de Bits
      • 3.7.1. Limitaciones de Campos de Bits
    • 3.8. Ventajas y Desventajas de Operar Bit a Bit
    1. El Preprocesador de C
    • 4.1. ¿Que Es Un Macro?
    • 4.2. Ejemplos de Macros
      • 4.2.1. Inclusi´on de Archivos
      • 4.2.2. Creaci´on de Archivos de Cabecera
      • 4.2.3. Creaci´on de Macros como Constantes
      • 4.2.4. Creaci´on de Macros como Funci´on
    • 4.3. Otras Directivas del Preprocesador
      • 4.3.1. #undef
      • 4.3.2. #if , #else , #elif
      • 4.3.3. #error
    • 4.4. Ventajas y Desventajas de Usar Macros

Operador Acci´on

& Operaci´on AND (bit a bit) simula una compuerta AND - 74ls08 TTL

| Operaci´on OR (bit a bit) simula una compuerta OR - 74ls32 TTL

∧ Operaci´on XOR (bit a bit) simula una compuerta XOR - 74ls86 TTL

∼ Complemento A1 a la base

>> Desplazamiento de bits hacia la derecha

<< Desplazamiento de bits hacia la izquierda

? : Operador Ternario

3.1. Operaci´on AND (Bit a Bit) (&)

Si recordamos que la operaci´on AND (Bit a Bit) esta definida por la siguiente tabla de verdad:

A B A&B

Como trabajamos con variables que ocupan 1 Byte (8 bits) la operaci´on AND Bit a Bit para estos casos se comportar´ıa

de la siguiente manera:

Supongamos que tenemos una variable a = 23 y otra variable b = 90, su representaci´on en binario de ambas seria:

a = 00010111 y b = 01011010

por lo tanto:

El resultado nos da un n´umero en binario cuya expresi´on es 00010010| 2 , que en decimal es conocido como 18| 10.

Por lo tanto llevando este ejemplo al lenguaje C, se realizar´ıa de la siguiente manera:

Ejemplo1: Operaci´on L´ogica AND Bit a Bit 1 #i n c l u d e 2 3 i n t main ( ) 4 { 5 c h a r a = 2 3 ; 6 c h a r b = 9 0 ; 7 c h a r r e s u l t a d o ; 8 9 p r i n t f ( ’ ’ a = % d b = % d ’ ’ , a , b ) ; 10 11 r e s u l t a d o = a & b ; 12 13 p r i n t f ( ’ ’ R e s u l t a d o = % d ’ ’ , r e s u l t a d o ) ; 14 15 r e t u r n 0 ; 16 }

Una aplicaci´on ´util para este operador, es si queremos averiguar si un bit de cierto n´umero es 1 o 0, por ejemplo, se

tiene el n´umero a = 75 y se quiere averiguar si el cuarto bit de dicho n´umero es 1 o 0. Para eso tenemos que aplicar el

operador & al n´umero a con un n´umero cuya representaci´on binaria sea 00001000, dicho n´umero es el 8.

Veamos como queda la operaci´on primero:

Entonces el c´odigo nos quedar´ıa de la siguiente forma:

Ejemplo2: Operaci´on L´ogica AND Bit a Bit 1 #i n c l u d e 2 3 i n t main ( ) 4 { 5 c h a r a = 7 5 ; 6 c h a r b = 8 ; 7 c h a r r e s u l t a d o ; 8 9 p r i n t f ( ’ ’ a = % d b = % d ’ ’ , a , b ) ; 10 11 i f ( a & b ) 12 p r i n t f ( ’ ’ e l c u a r t o b i t de l a v a r i a b l e a e s 1 \ n ’ ’ ) ; 13 e l s e 14 p r i n t f ( ’ ’ e l c u a r t o b i t de l a v a r i a b l e a e s 0 \ n ’ ’ ) ; 15 16 r e t u r n 0 ; 17 }

3.2. Operaci´on OR (Bit a Bit) (|)

Si recordamos que la operaci´on OR (Bit a Bit) esta definida por la siguiente tabla de verdad:

A B A|B

Como trabajamos con variables que ocupan 1 Byte (8 bits) la operaci´on AND Bit a Bit para estos casos se comportar´ıa

de la siguiente manera:

Supongamos que tenemos una variable a = 23 y otra variable b = 90, su representaci´on en binario de ambas seria:

a = 00010111 y b = 01011010

por lo tanto:

El resultado nos da un n´umero en binario cuya expresi´on es 01011111| 2 , que en decimal es conocido como 95| 10.

Ejemplo: Operaci´on L´ogica OR Bit a Bit 1 #i n c l u d e 2 3 i n t main ( ) 4 { 5 c h a r a = 2 3 ; 6 c h a r b = 9 0 ; 7 c h a r r e s u l t a d o ; 8 9 p r i n t f ( ’ ’ a = % d b = % d ’ ’ , a , b ) ; 10 11 r e s u l t a d o = a | b ; 12 13 p r i n t f ( ’ ’ R e s u l t a d o = % d ’ ’ , r e s u l t a d o ) ; 14 15 r e t u r n 0 ; 16 }

10 r e s u l t a d o = ˜ a ; 11 12 p r i n t f ( ’ ’ R e s u l t a d o = % d ’ ’ , r e s u l t a d o ) ; 13 14 r e t u r n 0 ; 15 }

3.5. Desplazamiento de Bits

Este tema no es facil de entender al principio, pero para que quede claro, uno puede hacer corrimientos de N Bits, con

N ∈ N, es decir N = 1, 2 ,.. .. Esta operaci´on sirve b´asicamente para modificar un n´umero a nivel Bit. Los corrimientos

de Bits, pueden ser en dos direcciones:

Corrimiento hacia la derecha

Corrimiento hacia la izquierda

3.5.1. Desplazamiento de Bits a la Derecha ( >> )

Supongamos que tenemos un Byte llamado a = 01101001 ⇒ 105 | 10 , a este n´umero se le puede ser corrimientos de bits

de la siguiente manera:

N´umero Cantidad de Bits de Corrimiento Resultado

Por lo tanto la funci´on para aplicarlo en el Lenguaje C, es:

numero >> cantidad bits de corrimiento;

Ejemplo: Desplazamiento a la Derecha de Bits 1 #i n c l u d e 2 3 i n t main ( ) 4 { 5 c h a r a = 1 0 5 ; 6 c h a r r e s u l t a d o ; 7 8 p r i n t f ( ’ ’ a = % d ’ ’ , a ) ; 9 10 r e s u l t a d o = a >> 1 ; 11 12 p r i n t f ( ’ ’ R e s u l t a d o = % d ’ ’ , r e s u l t a d o ) /∗ imprime 52 ∗/ ; 13 14 r e s u l t a d o = a >> 2 ; 15 16 p r i n t f ( ’ ’ R e s u l t a d o = % d ’ ’ , r e s u l t a d o ) /∗ imprime 26 ∗/ ; 17 r e t u r n 0 ; 18 }

En pocas palabras, los corrimientos de Bits hacia la derecha, consisten en realizar la divisi´on Entera del n´umero al

cual se le realiza dicho corrimiento, es decir:

numero >> cantidad bits de corrimiento; ≈ numero % (cantidad bits de corrimiento + 1);

3.5.2. Desplazamiento de Bits a la Izquierda ( < < )

Supongamos que tenemos un Byte llamado a = 01101001 ⇒ 105 | 10 , a este n´umero se le puede ser corrimientos de

bits de la siguiente manera:

Nota: Pueden apreciar que los valores obtenidos en la base decimal no coinciden en lo absoluto con su representaci´on

binaria, esto se debe al overflow que existe al realizar un desplazamiento de bits, lo cual para realizar esto, hay que tener

sumo cuidado!!

Por lo tanto la funci´on para aplicarlo en el Lenguaje C, es:

numero << cantidad bits de corrimiento;

Ejemplo: Desplazamiento a la Izquierda de Bits 1 2 #i n c l u d e 3 4 i n t main ( ) 5 { 6 c h a r a = 1 0 5 ; 7 c h a r r e s u l t a d o ; 8 9 p r i n t f ( ’ ’ a = % d ’ ’ , a ) ; 10 11 r e s u l t a d o = a << 1 ; 12 13 p r i n t f ( ’ ’ R e s u l t a d o = % d ’ ’ , r e s u l t a d o ) /∗ imprime 210 ∗/ ; 14 15 r e s u l t a d o = a << 2 ; 16 17 p r i n t f ( ’ ’ R e s u l t a d o = % d ’ ’ , r e s u l t a d o ) /∗ imprime 420 ∗/ ; 18 r e t u r n 0 ; 19 }

En pocas palabras, los corrimientos de Bits hacia la izquierda, consisten en realizar la multiplicaci´on del n´umero al

cual se le realiza dicho corrimiento, es decir:

numero << cantidad bits de corrimiento; ≈ numero ∗ (cantidad bits de corrimiento + 1);

3.6. Operador Ternario (? :)

Este operador tambi´en resulta complejo de comprender al principio, pero para entenderlo, tenemos que verlo desde el

punto de vista de un IF/ELSE. Ya que b´asicamente es la expresi´on abstracta de dicha operaci´on. El operador ternario

funciona con tres expresiones. Supongamos que tenemos tres expresiones (que claramente tienen que ser Expresiones que

arrojen resultados “booleandos” -hay que recordar que en C no existen los booleanos-) E 1 , E2 y E3. Si queremos realizar

operaciones dependiendo del estado de E1, uno dir´ıa, bueno acudamos a nuestro querido IF, entonces decimos que si E 1

= TRUE, entonces se ejecute la expresi´on E2, sino que se ejecute la expresi´on E3. Por lo tanto el c´odigo nos quedar´ıa de

la siguiente manera:

Utilizando un IF 1 /∗ c o d i g o a n t e r i o r ∗/ 2 i f ( E1 ) 3 E 4 e l s e 5 E 6 /∗ c o d i g o p o s t e r i o r ∗/

Ahora veamos como queda esto con el Operador Ternario

6 u n s i g n e d i n t v e r d e : 2 ; 7 u n s i g n e d i n t t r a n s p a r e n c i a : 1 ; 8 } c a m p o b i t s ;

Esta estructura define cinco variables. Dos de ellas (“mostrar” y “transparencia”) son de 1 bit, mientras que el resto

son de 2 bits. Se puede utilizar esta estructura u otra similar para codificar una imagen RGB de 16 colores, especificando

para cada p´ıxel su color, si es o no transparente y si debe o no mostrarse. Para acceder a cada variable del campo de bits

se emplea la misma sintaxis que en cualquier otra estructura de C com´un y corriente. Pero hay que tener en cuenta que

un bit s´olo puede tomar dos valores, 0 y 1 (en el caso de los campos de dos bits, ser´ıan cuatro los valores posibles: 0, 1, 2

y 3). Ya que si no tenemos esto en cuenta, podemos llegar a tener errores en tiempo de compilaci´on.

Ejemplo2: Uso de Campos de Bits 1 #i n c l u d e 2 3 s t r u c t s b i t s 4 { 5 u n s i g n e d i n t m o s t r a r : 1 ; 6 u n s i g n e d i n t r o j o : 2 ; 7 u n s i g n e d i n t a z u l : 2 ; 8 u n s i g n e d i n t v e r d e : 2 ; 9 u n s i g n e d i n t t r a n s p a r e n c i a : 1 ; 10 } c a m p o b i t s ; 11 12 i n t main ( ) 13 { 14 c a m p o b i t s unColor ; 15 /∗ c r e o un c o l o r a l e a t o r i o ∗/ 16 unColor. r o j o = 2 ; 17 unColor. a z u l = 1 ; 18 unColor. v e r d e = 3 ; 19 unColor. t r a n s p a r e n c i a = 0 ; 20 21 /∗ s i e l c o l o r no e s t r a n s p a r e n t e , e n t o n c e s a c t i v o e l campo para m o s t r a r l o en a l g u n a o p e r a c i o 22 23 i f ( unColor. t r a n s p a r e n c i a == 0 ) 24 { 25 unColor. m o s t r a r = 1 ; 26 } 27 28 /∗ a q u i v i e n e n o t r a s s e n t e n c i a s ∗/ 29 30 r e t u r n 0 ; 31 }

3.7.1. Limitaciones de Campos de Bits

Las variables de campos de bits tienen ciertas restricciones, veamos algunas de ellas:

No se puede aplicar el operador & sobre una de estas variables para averiguar su direcci´on de memoria (es decir, de

alg´un elemento del struct).

No se pueden construir arrays de un campo de bits (es decir, de alg´un elemento del struct).

En algunos entornos, los bits se dispondr´an de izquierda a derecha y, en otras, de derecha a izquierda, por lo que la

portabilidad puede verse comprometida!!!.

3.8. Ventajas y Desventajas de Operar Bit a Bit

Las ventajas que podemos obtener son:

Mayor velocidad de procesamiento al momento de ejecutar el programa.

Mas ahorro de memoria en caso de querer modificar variables.

Son ventajosos al momento de querer programar Microcontroladores (o Microprocesadores).

Ocupan poco espacio.

Las desventajas que podemos obtener son:

El c´odigo se puede tornar menos legible y bastante confuso.

Puede quitarle portabilidad al programa lo cual, no es muy agradable.

Seguido de la anterior, son dependientes de la arquitectura en donde se este trabajando.

Uno es mas libre a cometer errores y lograr facilmente overflow en la memoria de cualquier dispositivo en el que se

est´e programando.

  1. El Preprocesador de C

El preprocesador de C, es el primer programa invocado por el compilador y procesa directivas como:

# include

# define

# ifndef

# if

etc.

El preprocesador utiliza 4 etapas denominadas Fases de traducci´on. Aunque alguna implementaci´on puede elegir hacer

algunas o todas las fases simultaneamente, debe comportarse como si fuesen ejecutadas paso a paso.

1. Tokenizado l´exico: El preprocesador reemplaza la secuencia de trigrafos por los caracteres que representan (en

pocas lineas, consisten en reemplazar s´ımbolos en los cuales no son aplicados en algunos pa´ıses, como por ejemplo

∼ o el identificador de un macro, etc).

2. Empalmado de l´ıneas: Las l´ıneas de c´odigo que contin´uan con secuencias de escape de nueva l´ınea son unidas

para formar l´ıneas l´ogicas (ejemplo reconoce cuando puede o no haber un fin de linea \n).

3. Tokenizaci´on: Reemplaza los comentarios por espacios en blanco. Divide cada uno de los elementos a preprocesar

por un car´acter de separaci´on.

4. Expansi´on de macros y gesti´on de directivas: Ejecuta las l´ıneas con directivas de preprocesado incluyendo las

que incluye otros archivos y las de compilaci´on condicional. Adem´as expande las macros.

Pero en definitiva, el preprocesador es un programa separado que es invocado por el compilador antes de que co-

mience la traducci´on real. Un preprocesador de este tipo puede eliminar los comentarios, incluir otros archivos y ejecutar

sustituciones de macros.

Ahora bien, la pregunta del mill´on que quiz´as surja es la siguiente ¿Que es un Macro?. Para eso vamos a dar la

definici´on de Macro.

4.1. ¿Que Es Un Macro?

Un Macro, es una herramienta que nos permite evitar al programador la tediosa repetici´on de partes id´enticas de

un programa, los ensambladores y compiladores cuentan con macroprocesadores que permiten definir una abreviatura

para representar una parte de un programa y utilizar esa abreviatura cuantas veces sea necesario. Para utilizar una

macro, primero hay que declararla. En la declaraci´on se establece el nombre que se le dar´a a la macro y el conjunto de

instrucciones que representar´a.

El programador escribir´a el nombre de la macro en cada uno de los lugares donde se requiera la aplicaci´on de las

instrucciones por ella representadas. La declaraci´on se realiza una sola vez, pero la utilizaci´on o invocaci´on del macro

puede hacerse cuantas veces sea necesario. La utilizaci´on de macros posibilita la reducci´on del tama˜no del c´odigo fuente,

aunque el c´odigo objeto tiende a ser mayor que cuando se utilizan funciones.

Estructura de un Macro Objeto 1 #d e f i n e < l i s t a de t o k e n s a r e e m p l a z a r en e l c o d i g o >

Veamos un ejemplo de como se construye un Macro Objeto:

Ejemplo: Construcci´on de un Macro Objeto 1 #i n c l u d e 2 #d e f i n e PI 3. 1 4 1 5 9 3 #d e f i n e SALUDO ‘ ‘ Hola Mundo ’ ’ 4 5 i n t main ( ) 6 { 7 p r i n t f ( ’ ’ % f ’ ’ , PI ) ; /∗ Esto imprime 3. 1 4 1 5 9 por p a n t a l l a ∗/ 8 p r i n t f (SALUDO) ; /∗ Esto imprime Hola Mundo por p a n t a l l a ∗/ 9 10 r e t u r n 0 ; 11 }

Podemos apreciar que:

es PI

<lista de tokens a reemplazar en el c´odigo> es 3.

En definitiva creamos un Macro Objeto llamado PI, que en cualquier parte del c´odigo donde aparezca “PI”, ser´a re-

emplazado por 3.14159. Esta ventaja de crear este tipo de Constantes, es que no ocupan lugar en memoria, sino que son

reemplazados en tiempo de compilaci´on, haciendo que el programa sea un poco mas liviano!!

4.2.4. Creaci´on de Macros como Funci´on

Estos tipos de Macros son conocidos como Macro Funciones (valga la redundancia). Para poder definir una Macro

Funci´on en C, se tiene que tener presente como est´a compuesto. La estructura gen´erica de una Macro Funci´on no difiere

casi en nada a la de un Macro Objeto, s´olo tiene una diferencia y es que toda sentencia dentro de una Macro Funci´on

tiene que ir entre par´entesis ( ) aunque una gran ventaja es que pueden hacerse macros multilinea, es decir, que pueden

hacer macros con mas de una linea de c´odigo, siempre y cuando antepongan el s´ımbolo “\” al final de cada linea. Veamos

un ejemplo de como crear una Macro Funci´on, como por ejemplo, una Macro Funci´on que calcule si un n´umero es mas

grande que otro.

Ejemplo: Construcci´on de una Macro Funci´on 1 #i n c l u d e 2 3 #d e f i n e MAX( a , b ) ( ( a > b )? a : b ) 4 5 i n t main ( ) 6 { 7 i n t num1 ; 8 i n t num2 ; 9 10 p r i n t f ( ’ ’ i n g r e s e un numero \n ’ ’ ) ; 11 s c a n f ( ’ ’ % d ’ ’ ,&num1 ) ; 12 p r i n t f ( ’ ’ i n g r e s e o t r o numero \n ’ ’ ) ; 13 s c a n f ( ’ ’ % d ’ ’ ,&num2 ) ; 14 15 p r i n t f ( ’ ’ El maximo e n t r e % d y % d e s : % d \n ’ ’ ,num1 , num2 ,MAX(num1 , num2 ) ) ; 16 17 r e t u r n 0 ; 18 }

El ´unico problema que presenta realizar una Macro Funci´on de esta manera, es que eval´ua 2 veces a cualquiera de las

2 variables (en este caso a o b), dependiendo la condici´on que cumpla, lo cual no es del todo prolijo y hay que tener sumo

cuidado cuando uno quiere hacer una Macro Funci´on que modifique una variable, ya que podr´ıa modificarla dos veces y

no ser´ıa un resultado del todo agradable. Si se esta trabajando con ANSI C, este problema es inevitable, lo cual no hay

manera de salvar este problema. Por lo tanto si se quiere realizar Macro Funciones en ANSI C, hay que tener mucho

cuidado y pensarlo dos veces si esa funci´on conviene o no hacerla en Macro.

Si se trabaja en otra estandarizaci´on de C, como por ejemplo C99, uno puede salvar este problema con una sentencia

llamada “tipeof()”.

Dicha sentencia lo que hace es averiguar el tipo de dato que compone la variable que se le introduzca, y as´ı evita

que haya una sobrevaluaci´on de dicha variable (igual a esto hay que tomarlo con pinzas, ya que le estar´ıamos quitando

portabilidad al programa).

Entonces el ejemplo anterior quedar´ıa como:

Soluci´on al problema 1 #i n c l u d e 2 #d e f i n e MAX( a , b )
3 ( { t y p e o f ( a ) a = ( a ) ;
4 t y p e o f ( b ) b = ( b ) ;
5 a > b? a : b ; } ) 6 7 i n t main ( ) 8 { 9 i n t num1 ; 10 i n t num2 ; 11 12 p r i n t f ( ’ ’ i n g r e s e un numero \n ’ ’ ) ; 13 s c a n f ( ’ ’ % d ’ ’ ,&num1 ) ; 14 p r i n t f ( ’ ’ i n g r e s e o t r o numero \n ’ ’ ) ; 15 s c a n f ( ’ ’ % d ’ ’ ,&num2 ) ; 16 17 p r i n t f ( ’ ’ El maximo e n t r e % d y % d e s : % d \n ’ ’ ,num1 , num2 ,MAX(num1 , num2 ) ) ; 18 19 r e t u r n 0 ; 20 }

Veamos tambi´en como podemos realizar la funci´on que calcula si un n´umero es Par o No a bajo nivel por medio de

Macro Funciones:

Macro Funci´on Bajo Nivel para averiguar si un n´umero es Par o No 1 #i n c l u d e 2 #d e f i n e PAR( a )
3 ( ( a & 1 )? p r i n t f ( ” El numero e s Impar ” ) : p r i n t f ( ” El numero e s Par ” ) ) 4 5 i n t main ( ) 6 { 7 i n t num1 ; 8 9 p r i n t f ( ’ ’ i n g r e s e un numero \n ’ ’ ) ; 10 s c a n f ( ’ ’ % d ’ ’ ,&num1 ) ; 11 PAR(num1 ) ; 12 13 r e t u r n 0 ; 14 }

Otra herramienta ´util de una macro funci´on es lo que se denomina “redefinici´on” de una funci´on, es decir, que puedo

renombrar a una funci´on y que haga exactamente lo mismo o con algunos ligeros cambios.

Supongamos que queremos redefinir la funci´on “printf” de C y queremos que se llame IMPRIMIR y que siempre que

se la cite imprima por pantalla “Mensaje: ”. Entonces el c´odigo quedar´ıa de la siguiente

forma:

Redefinici´on de una Funci´on 1 #i n c l u d e 2 #d e f i n e IMPRIMIR( s )
3 p r i n t f ( ” Mensaje : \” %s \”\n” , s ) ; 4 5 i n t main ( ) 6 { 7 IMPRIMIR( ’ ’ Hola Mundo ’ ’ ) ; /∗ imprime por p a n t a l l a Mensaje : Hola Mundo∗/ 8 r e t u r n 0 ; 9 }

5 #d e f i n e NUM2 0 6 7 i n t main ( ) 8 { 9 #i f NUM2 != 0 10 p r i n t f ( ” % f ” , DIVIDIR (NUM1,NUM2) ) ; 11 #e l s e 12 #e r r o r d i v i s i o n por c e r o! 13 #e n d i f 14 r e t u r n 0 ; 15 }

Por ejemplo si usamos codeblocks para compilar dicho programa, nos mostrar´ıa un mensaje de error al compilar del

estilo:

Figura 1: Mensaje de Error Utilizando #error

4.4. Ventajas y Desventajas de Usar Macros

La ventaja de usar macros son:

Al utilizar Macro Funciones se acelera la ejecuci´on del programa

Al utilizar tanto Macro Funciones como Macro Objetos, las “variables locales” o “constantes” no ocupan espacio

en memoria!!!

Pero como dice el dicho “todo lo bueno siempre tiene algo malo” los Macros poseen tres desventajas de gran conside-

raci´on. Dichas desventajas son:

El tama˜no del c´odigo aumenta. Ya que se expande m´as el c´odigo y no hay manera de encapsularlo

El uso de macros queda fuera del normal planteamiento estructurado de creaci´on de programas. Es decir en tiempo

de dise˜no no se suelen plantear macros, lo cual puede generar confusiones al momento de implementarlos y llevar

una perdida de tiempo debatiendo si es conveniente o no construirlos

Los lenguajes modernos (como C#, Java, etc) no utilizan macros, lo cual si tenemos que exportar el c´odigo hecho

a alguno de esto lenguajes, vamos a tener que reconstruirlo y eso llevar´ıa una p´erdida de tiempo.