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).