Page 206

3.7 Macros Por regla general, son m´ as r´apidas que las funciones, pues al no implicar una llamada a funci´ on en tiempo de ejecuci´on nos ahorramos la copia de argumentos en pila y el salto/retorno a otro lugar del programa. No obligan a dar informaci´ on de tipo acerca de los par´ametros ni del valor de retorno. Por ejemplo, esta macro devuelve el m´aximo de dos n´ umeros, sin importar que sean enteros o flotantes: 1

#define MAXIMO(A, B) ((A > B) ? A : B)

Pero tienen serios inconvenientes: La definici´ on de la macro debe ocupar, en principio, una sola l´ınea. Si ocupa m´as de una l´ınea, hemos de finalizar todas menos la u ´ltima con el car´acter ((\)) justo antes del salto de l´ınea. Inc´ omodo. No puedes definir variables locales.7 No admiten recursi´ on. Son peligros´ısimas. ¿Qu´e crees que muestra por pantalla este programa?: 1

#include <stdio.h>

2 3

#define CUADRADO(x) x*x

4 5 6 7 8 9

int main (void) { printf ("El cuadrado de 6 es %d\n", CUADRADO(3+3) ); return 0; }

¿36?, es decir, ¿el cuadrado de 6? Pues no es eso lo que obtienes, sino 15. ¿Por qu´e? El preprocesador sustituye el fragmento CUADRADO(3+3) por. . . ¡3+3*3+3! El resultado es, efectivamente, 15, y no el que esper´abamos. Puedes evitar este problema usando par´entesis: 1

#include <stdio.h>

2 3

#define CUADRADO(x) (x) * (x)

4 5 6 7 8 9

main (void) { printf ("El cuadrado de 6 es %d\n", CUADRADO(3+3) ); return 0; }

Ahora el fragmento CUADRADO(3+3) se sustituye por (3+3)*(3+3), que es lo que esperamos. Otro problema resuelto. No te f´ıes. Ya te hemos dicho que las macros son peligrosas. Sigue estando mal. ¿Qu´e esperas que calcule 1.0/CUADRADO(3+3)?, ¿el valor de 1/36, es decir, 0.02777. . . ? Te equivocas. La expresi´ on 1.0/CUADRADO(3+3) se convierte en 1.0/(3+3)*(3+3), que es 1/6 · 6, o sea, 1, no 1/36. La soluci´ on pasa por a˜ nadir nuevos par´entesis: 1

#include <stdio.h>

2 3

#define CUADRADO(x) ((x)*(x))

4 5

7 No

200

...

del todo cierto, pero no entraremos en detalles.

Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement