Макрос и функция с тем же именем

У меня есть следующий код

#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: Спасибо за Вас справка. Но я могу только изменить определение макроса, я не могу сменить его положение, и я не могу изменить реализацию функции.

9
задан Brian Tompsett - 汤莱恩 19 February 2016 в 23:47
поделиться

5 ответов

Используйте (), чтобы остановить препроцессор от расширения определения функции:

#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;
}
20
ответ дан 4 December 2019 в 07:14
поделиться

Я вижу три возможных решения:

  • определите свой макрос после определения функции.

  • ] перед определением функции определяют do_a () и do_b () , чтобы они возвращали свой аргумент, и переопределяли их по вашему желанию после определения функции

  • выполнить do_a () и do_b () внутри функции:

     void myfunc (int a, int b)
    {
     do_blah (do_a (а), do_b (б));
    }
    

Я сильно предпочитаю последнее.

8
ответ дан 4 December 2019 в 07:14
поделиться

Определите макрос после определение функции.

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;
}
3
ответ дан 4 December 2019 в 07:14
поделиться

Определите макрос после определения функции.

Или используйте следующий шаблон:

#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;
}
0
ответ дан 4 December 2019 в 07:14
поделиться

Почему нельзя изменить исходный код? В худшем случае, если вам нужно сохранить исходную версию, запустите на ней патч , чтобы создать временный файл, в котором функция переименована, и построить его оттуда.

0
ответ дан 4 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: