HOW-TO: Macros en C (I) – #define

Publicado por Alejandro Escario en

Todo programador de C y C++ que se precie debe estar más o menos familiarizado con las directivas de preprocesador en general y mas concretamente, debería estarlo con las llamadas Macros. Una macro es un trozo de código, usualmente en la zona de cabecera o en los propios ficheros de cabecera (*.h).

Las macros se definen mediante la directiva #define; veamos un ejemplo:

#define PI 3.14159

Esta macro se encarga de asociar el valor 3.14159 con el valor PI mediante la directiva #define, es decir, la estructura sería algo así como lo siguiente:

#define <alias> <valor>

dónde <alias> es el nombre que queremos utilizar para referirnos al término que ocuparía el lugar de <valor>. Ésta característica de C se utiliza sobre todo para facilitar el uso de variables que durante todo el programa van a tener el mismo valor, ya sea por el hecho de que son constantes, como por ejemplo el valor del número pi (3.14159), el valor de la gravedad terrestre g (9.81) o cualquier otra constante o porque simplmente son eso, constantes que no variarán, como por ejemplo el tamaño máximo de un array.

Un aspecto relativamente importante de las macros es que, por convenio, y para facilitar la lectura de las mismas en programas, se suelen utilizar letras mayúsclas, de manera que si nos encontramos con:

int main(int argc, char** argv){

printf("%f, %f", r, PI);

return 0;

}

podríamos concluir que la letra r se corresponde con una variable, ya que está está (o empieza) con minúsculas, mientras que PI es un valor constante. Ambos valores han de estar definidos con anterioridad.

Veamos un ejemplo práctico de uso:


#include <stdio.h>

#define PI 3.14159

int main(int argc, char** argv){

double radio = 25.684;

double area = PI * radio * radio;

return 0;

}

La directiva #define no sólo nos servirá para definir valores de variables, sino que también podremos utilizarlo para declarar valores de arrays:

#define CONTENIDO 0, 
                     1, 
                     2
int main(int argc, char** argv){
int valores[] = { CONTENIDO };
return 0;
}

Como habréis podido comprobar detrás de las dos primeras líneas de código aparece una barra inclinada (), esto quiere decir que la declaración de la macro va a continuar en la línea siguiente, lo cual nos facilitará enormemente la legibilidad de nuestro código.

¿Por qué nos convendría usar macros?

El uso de macros puede parecer un poco absurdo de buenas a primeras, ya que podemos utilizar funciones (ya veremos más adelante el porqué de esta afirmación) o variables para conseguir los mismos resultados. La diferencia entre usar unas u otras es que al usar macros, el código del <alias> se sustituye por el del <valor> durante el proceso de pre-compilación, de manera que a la hora de compilarlo, el código queda sustituido y al ejecutarlo no tendremos que malgastar ciclos de CPU realizando cálculos como este.

¿Podemos invalidar algo declarado con un #define?

Efectivamente podemos hacerlo mediante el uso de la directiva de preprocesador:

#undef <alias>
Categorías: C/C++