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() and do_b() such that they return their argument, and redefine them at your will after function definition

  • perform do_a() and do_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;
}