宏和功能相同的名称

时间:2009-12-23 10:14:07

标签: c macros c-preprocessor

我有以下代码

#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: 谢谢你的帮助。但是我只能改变宏的定义,我无法改变它的位置而且我无法改变函数的实现。

5 个答案:

答案 0 :(得分:19)

使用()阻止预处理器扩展函数定义:

#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;
}

答案 1 :(得分:8)

我看到三种可能的解决方案:

  • 在函数定义后定义宏。

  • 在函数定义之前定义do_a()do_b(),以便它们返回它们的参数,并在函数定义后按照您的意愿重新定义它们

  • 在函数内执行do_a()do_b()

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

我非常偏爱后者。

答案 2 :(得分:3)

在函数定义之后定义宏

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 :(得分: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;
}

答案 4 :(得分:0)

为什么不能更改源代码?在最坏的情况下,如果您需要维护原始版本,请在其上运行patch以创建一个临时文件,在该文件中重命名该函数并从那里构建它。