Macro and function with same name
Solution 1:
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;
}
Solution 2:
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 definition-
perform
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.
Solution 3:
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;
}