views:

201

answers:

5

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 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.

A: 

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;
}
moonshadow
+2  A: 

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;
}
drhirsch
+8  A: 

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.

mouviciel
A: 

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.

Pete Kirkham
it is legacy code.. changing function or macro names is not an option.
Yousf
It is simply impossible that you can change the macro and not the function. It is simply impossible that you can compile a file but not choose which file to compile. You're talking rubbish.
Pete Kirkham
+4  A: 

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;
}
pmg
It works :)thanks
Yousf
Tim Schaeffer
Good point, Tim, thanks! But I think it's safe to assume the preprocessor will never enter a recursive loop (cf Standard 6.10.3.4/2 "... if any nested replacements encounter the name of the macro being replaced, it is not replaced ...").
pmg
If you can change the function to put () around it's name, why can you not change the function's name?
Pete Kirkham
I've been wondering about that too, but didn't have the guts to ask the question directly :)
pmg
To change the function's name you have to - get approval from all the managers- update all documents- re-run test cases
Yousf