C 具有相同名称的宏和函数

C 具有相同名称的宏和函数,c,macros,c-preprocessor,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);

我有以下代码

#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;
}
#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;
}
问题是函数定义也是这样展开的

void myfunc(do_a(int a), do_b(int b))
{
  do_blah(a,b);
}
只有在扩展函数调用时,才有办法使宏扩展吗? 我尝试了很多解决方案,似乎不可能,但我希望有人能看到这样的情况

注意:请不要告诉我重命名宏或函数名:D

更新1:
谢谢你的帮助。但我只能更改宏的定义,不能更改宏的位置,也不能更改函数的实现。

在定义函数后定义宏

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;
}
或者,使用如下模式:

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;
}
#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;
}
定义函数后定义宏

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

我认为有三种可能的解决办法:

  • 在函数定义之后定义宏

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

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

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

我非常喜欢后者。

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

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

#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;
}
#包括
#定义myfunc(a,b)myfunc(do_a(a),do_b(b))
/*如果你有一个非标准的预处理器
*并为上一个定义输入一个循环,即define
*带有一组额外括号的myfunc:
#定义myfunc(a,b)(myfunc)(do_a(a),do_b(b))
******** */
int(myfunc)(inta,intb)/*myfunc不会在这里展开*/
{
printf(“a=%d;b=%d\n”,a,b);
返回0;
}
int do_a(int a)
{
返回a*2;
}
int do_b(int b)
{
返回b-5;
}
内部主(空)
{
myfunc(4,0);
返回0;
}

这是旧代码。。更改函数或宏名称不是选项。您不可能更改宏而不更改函数。您不可能只编译一个文件而不选择要编译的文件。你在胡说八道。我认为一些预处理器可能会对myfunc(xxx,xxx)形式的递归使用犹豫不决。我会定义myfunc(a,b)(myfunc)(do_a(a),do_b(b))int(myfunc)(int a,int b)&cGood point,蒂姆,谢谢!但我认为可以安全地假设预处理器永远不会进入递归循环(参见标准6.10.3.4/2“…如果任何嵌套替换遇到被替换宏的名称,它不会被替换…”)。如果可以将函数更改为在其名称周围放置(),为什么不能更改函数的名称?我也一直在想,但是没有勇气直接问这个问题:)要更改函数的名称,你必须-得到所有经理的批准-更新所有文档-重新运行测试用例