У меня есть следующий код
#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: Спасибо за Вас справка. Но я могу только изменить определение макроса, я не могу сменить его положение, и я не могу изменить реализацию функции.
Используйте ()
, чтобы остановить препроцессор от расширения определения функции:
#include <stdio.h>
#define myfunc(a, b) myfunc(do_a(a), do_b(b))
/* if you have a preprocessor that may be non-standard
* and enter a loop for the previous definition, define
* myfunc with an extra set of parenthesis:
#define myfunc(a, b) (myfunc)(do_a(a), do_b(b))
******** */
int (myfunc)(int a, int b) /* myfunc does not get expanded here */
{
printf("a=%d; b=%d\n", a, b);
return 0;
}
int do_a(int a)
{
return a * 2;
}
int do_b(int b)
{
return b - 5;
}
int main(void)
{
myfunc(4, 0);
return 0;
}
Я вижу три возможных решения:
определите свой макрос после определения функции.
] перед определением функции определяют do_a ()
и do_b ()
, чтобы они возвращали свой аргумент, и переопределяли их по вашему желанию после определения функции
выполнить do_a ()
и do_b ()
внутри функции:
void myfunc (int a, int b)
{
do_blah (do_a (а), do_b (б));
}
Я сильно предпочитаю последнее.
Определите макрос после определение функции.
void myfunc(int a, int b)
{
do_blah(a,b);
}
#define myfunc(a,b) myfunc(do_a(a), do_b(b))
int main()
{
int x = 6, y = 7;
myfunc(x,y);
return 0;
}
Определите макрос после определения функции.
Или используйте следующий шаблон:
#define myfunc_macro(a,b) myfunc(do_a(a), do_b(b))
#define myfunc(a,b) myfunc_macro(a,b)
.
.
#undef myfunc
void myfunc(int a, int b)
{
do_blah(a,b);
}
#define myfunc(a,b) myfunc_macro(a,b)
.
.
int main()
{
int x = 6, y = 7;
myfunc(x,y);
return 0;
}
Почему нельзя изменить исходный код? В худшем случае, если вам нужно сохранить исходную версию, запустите на ней патч , чтобы создать временный файл, в котором функция переименована, и построить его оттуда.