宏和function相同的名称

我有以下代码

#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  #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(a),do_b(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; } 

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