Вы находитесь на странице: 1из 3

C: Macros...

El lenguaje C nos permite definir un tipo especial de "funciones":


las macros. Coloco esto entre comillas ya que no pueden considerarse funciones
reales.

Una macro tiene parámetros y se las llama igual que a las funciones, pero ese
llamado no es traducido por el compilador como un verdadero llamado a una
función.

Para terminar esta introducción, hay que decir que las macros resultan más
rápidas que las funciones en tiempo de ejecución ya que nos ahorramos todos los
detalles que implica llamar a una, constituyendo esto una ventaja pero también
tienen sus desventajas como el hecho de no permitir la declaración de variables
locales, no admitir recursión y, como veremos, suelen ser peligrosas ya que
debemos extremar cuidados al momento de usarlas.

Definiendo una macro:

Una macro debe definirse antes de la función main de la misma forma que
definíamosconstantes, usando #define aunque a diferencia de las mismas, luego
del nombre de la macro colocaremos entre paréntesis sus parámetros (sin
especificar el tipo de dato) y luego de ello definiremos en una sola línea el cuerpo
de la misma.

Por lo que la estructura de una macro sería algo como esto:

Veamos un ejemplo de una macro que calcule el cubo de un número:

En caso que necesitáramos que una macro ocupe más de una línea, debemos
finalizar todas las líneas en el caracter \ excluyendo la última.

Llamando a una macro:

Como dijimos al comienzo, el llamado a una macro se hace de la misma manera


que el llamado a una función. Si debemos devolver un resultado la asignamos a
alguna variable o la usamos en alguna estructura.

Veamos cómo llamaríamos dentro de un printf la macro que definimos


anteriormente:

Donde x es un entero que declaramos anteriormente. Si x fuera 5 , CUBO(x) nos


devolvería el valor 125 que es el que buscábamos pero no todo lo que brilla es oro
como veremos más adelante.

¿Qué hace el programa al hacer el llamado a una macro?

Cuando hacemos el llamado a una macro, lo que se hace realmente es reemplazar


la llamada por el cuerpo de la macro, simplemente eso.

Osea que en el ejemplo anterior se hace lo siguiente:

Por esta razón, las macros se pueden convertir en armas de doble filo, ya que
podríamos obtener resultados muy diferentes a los esperados.

A tener en cuenta:

¿Por qué podemos obtener resultados diferentes a los esperados? Respondamos


esta pregunta con el ejemplo anterior, sólo que esta vez donde dice x
colocaremos 1+1 que para nosotros es 2, como lo que tendríamos:

Normalmente pensaríamos que esto debe devolver el cubo de 2 que es 8, pero no


es así ¿por qué?... por lo que explicamos antes acerca de lo que pasa al llamar una
macro:

Por lo que para ahorrarnos estos problemas deberíamos colocar paréntesis en la


definición de la macro:

Y siempre tendríamos que tener en cuenta lo que hace la macro para saber si
realmente obtendremos el resultado esperado, por lo que son una herramienta
algo "peligrosa" al momento de usarlas. Pero si tenemos claros los conceptos
podríamos hacer un buen uso de ellas.

Para terminar, queda en manos de cada uno hacer uso de las herramientas que le
parezcan adecuadas para cumplir sus objetivos a la hora de programar, pero
desdeProgramacion.NERD no aconsejamos utilizar macros existiendo otras
herramientas mejores como las funciones inline que veremos en el próximo post.