У меня есть следующий кодМакро и функция с таким же именем
#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;
}
Я хочу предварительно процессор расширить функции MyFunc только при вызове. Необходимый код после предварительной обработки выглядит следующим образом:
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;
}
Проблема в том, что определение функции расширяется также как этот
void myfunc(do_a(int a), do_b(int b))
{
do_blah(a,b);
}
Есть ли способ сделать макрос расширяется только тогда, когда мы расширяем функцию вызов? Я пробовал много решений, и это кажется невозможным, но я надеюсь, что кто-то видел подобную ситуацию ..
Примечание: Пожалуйста, не говорите мне, чтобы переименовать макрос или функцию имен: D
Update1: Спасибо за помощь. Но я могу изменить определение макроса, я не могу изменить его положение, и я не могу изменить реализацию функции.
Это работает :) спасибо – Yousf
Я думаю, что некоторые препроцессоры могут отказаться от рекурсивного использования формы myfunc (xxx, xxx).Я бы сделал #define MyFunc (а, Ь) (MyFunc) (do_a (а), do_b (б)) Int (MyFunc) (Int А, внутр б) и с –
Хорошая мысль, Тим, спасибо ! Но я думаю, что можно с уверенностью предположить, что препроцессор никогда не войдет в рекурсивный цикл (cf Standard 6.10.3.4/2 "... если какие-либо вложенные замены встречаются с именем заменяемого макроса, оно не заменяется ..."). – pmg