You*_*usf 9 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;
}
Run Code Online (Sandbox Code Playgroud)
我希望预处理器只在调用时扩展函数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;
}
Run Code Online (Sandbox Code Playgroud)
问题是函数定义也像这样扩展
void myfunc(do_a(int a), do_b(int b))
{
do_blah(a,b);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法只在我们扩展函数调用时才进行宏扩展?我尝试了很多解决方案,似乎不可能,但我希望有人看到这样的情况......
注意:请不要告诉我重命名宏或函数名称:D
Update1:谢谢你的帮助.但我只能改变宏的定义,我无法改变它的位置,我也无法改变函数的实现.
pmg*_*pmg 20
使用()
从扩展功能定义停止预处理:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我看到三种可能的解决方案
在函数定义后定义宏.
在函数定义之前定义,do_a()
并且do_b()
它们返回它们的参数,并在函数定义之后根据您的意愿重新定义它们
执行do_a()
和do_b()
内部功能:
void myfunc(int a, int b)
{
do_blah(do_a(a),do_b(b));
}
Run Code Online (Sandbox Code Playgroud)我非常喜欢后者.