10.2 Macros
con parámetros
La
orden
#define
admite también pasar parámetros a las macros, para que se
comporten de forma similar a las funciones.
La
sintaxis es:
#define
macro(arg1,arg2,...)
texto_sustituto
No
puede haber espacios entre
macro
y el paréntesis. Los nombres entre paréntesis y separados por
comas se tratan como si fueran argumentos pasados a una función. Todas
las apariciones de
arg1
en el
texto_sustituto
serán reemplazadas en el texto definitivo por el argumento realmente
escrito en
arg1
cuando se llama a la macro en el fichero fuente.
Con
unos ejemplos:
#define incrementa(x) (x)++
#define max(a,b) (a)>(b)?(a):(b)
#define ERROR(n) printf("Error: %s\n", mensaje[n])
#define ERR_FICH 0
#define ERR_DIV 1
char* mensaje [] =
{
"no se pudo abrir el fichero",
"división por cero"
}
...
int x = 0;
incrementa(x); /* x vale ahora 1 */
x=max(3,5); /* x vale ahora 5 */
if ( !fopen("pepe.txt","r") )
ERROR (ERR_FICH);
Precauciones
con los argumentos
Las
macros con parámetros son
parecidas
a funciones, pero sólo se limitan a sustituir texto. Supongamos la macro
#define producto(a,b) a*b
Si
escribimos esta llamada:
u=1; v=3;
x = producto(2+u,v+6);
la
macro se expande a esta expresión:
x = 2+u*v+6;
El
valor depositado en
x
es 11, lo cual probablemente no era el resultado deseado (27). Para que no
ocurran estos problemas, hay que encerrar en paréntesis los argumentos
en las definiciones de las macros:
#define producto(a,b) (a)*(b)
En
conclusión, hay que tener precaución con los argumentos, y usar
paréntesis en las declaraciones de macros (incluso abusar de ellos).