I have the following code
#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;
}
I want the pre-processor to expand function myfunc only at calling. Required code after pre-processing looks like this:
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;
}
The problem is that function definition is expanded also like this
void myfunc(do_a(int a), do_b(int b))
{
do_blah(a,b);
}
Is there any way to make macro expands only if we are expanding a function call? I tried many solutions, and it seems impossible but I hope that some one saw situation like this..
NOTE: please don't tell me to rename 开发者_JS百科the macro or function names :D
Update1: Thanks for you help. But I can only change the definition of the macro, I can't change its position and I can't change function implementation.
Use ()
to stop the preprocessor from expanding the function definition:
#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;
}
I see three possible solutions:
define your macro after function definition.
define, before the function definition,
do_a()
anddo_b()
such that they return their argument, and redefine them at your will after function definitionperform
do_a()
anddo_b()
inside the function:void myfunc(int a, int b) { do_blah(do_a(a),do_b(b)); }
I have a strong preference for the latter.
Define the macro after the defintion of the function.
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 the macro after you define the function.
Alternatively, use a pattern like this:
#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;
}
Why can you not change the source code? At worst, if you need to maintain the original version, run a patch on it to create a temporary file in which the function is renamed and build it from there.
精彩评论