tengo el siguiente códigoMacro y la función con el mismo nombre
#define myfunc(a,b) myfunc(do_a(a), do_b(b))
void myfunc(int a, int b)
{
do_blah(a,b);
}
int main()
{
int x = 6, y = 7;
myfunc(x,y);
return 0;
}
Quiero que el pre-procesador para ampliar myfunc función sólo al llamar. código necesario después del pre-procesamiento se ve así:
void myfunc(int a, int b)
{
do_blah(a,b);
}
int main()
{
int x = 6, y = 7;
myfunc(do_a(x),do_b(y));
return 0;
}
El problema se se expande también que la definición de una función como esta
void myfunc(do_a(int a), do_b(int b))
{
do_blah(a,b);
}
¿Hay alguna manera de hacer macro se expande sólo si estamos ampliando una función ¿llamada? He intentado muchas soluciones, y parece imposible, pero espero que alguien vio situación como esta ..
NOTA: Por favor, no me diga que cambiar el nombre de los nombres de macro o función: D
Update1: Gracias por tu ayuda. Pero solo puedo cambiar la definición de la macro, no puedo cambiar su posición y no puedo cambiar la implementación de la función.
Funciona :) gracias – Yousf
Creo que algunos preprocesadores pueden obstaculizar el uso recursivo de la forma myfunc (xxx, xxx).Lo haría myfunC#define (a, b) (myfunc) (do_a (a), do_b (b)) int (myfunc) (int a, int b) etc. –
Buen punto, Tim, gracias ! Pero creo que es seguro suponer que el preprocesador nunca ingresará un bucle recursivo (cf Estándar 6.10.3.4/2 "... si alguno de los reemplazos anidados encuentra el nombre de la macro que se reemplaza, no se reemplaza ..."). – pmg