Ho il seguente codiceMacro e funzione con lo stesso nome
#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;
}
voglio il pre-processore per espandere function funzione solo in caso di chiamata. codice richiesto dopo il pre-processing si presenta così:
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;
}
Il problema è che la definizione di funzione è espansa anche in questo modo
void myfunc(do_a(int a), do_b(int b))
{
do_blah(a,b);
}
C'è un modo per rendere la macro si espande solo se stiamo espandendo una funzione chiamata? Ho provato molte soluzioni, e sembra impossibile, ma spero che qualcuno ha visto situazione come questa ..
NOTA: per favore non mi dica per rinominare i nomi delle macro o funzione: D
Update1: Grazie per il tuo aiuto. Ma posso solo cambiare la definizione della macro, non posso cambiare la sua posizione e non posso cambiare l'implementazione della funzione.
Funziona :) grazie – Yousf
Penso che alcuni preprocessori potrebbero rifiutare l'uso ricorsivo del modulo myfunc (xxx, xxx).Farei #define myfunc (a, b) (myfunc) (do_a (a), do_b (b)) int (myfunc) (int a, int b) ec & –
Buon punto, Tim, grazie ! Ma penso che sia sicuro supporre che il preprocessore non inserirà mai un ciclo ricorsivo (cfr. Standard 6.10.3.4/2 "... se qualche sostituzione annidata incontra il nome della macro che viene sostituita, non viene sostituita ..."). – pmg