On Mon, Sep 25, 2006 at 05:23:34PM +0200, Jan Beulich wrote: > Can anyone set me strait on why, in the following code fragment > > int x(unsigned); > > struct alt_x { > unsigned val; > }; > > #define x alt_x > #define alt_x(p) x(p+1) > > int test(struct x *p) { > return x(p->val); > } > > the function invoked in test() is alt_x (rather than x)? I would have > expected that the preprocessor > - finds that x is an object like macro, and replaces it with alt_x > - finds that alt_x is a function-like macro and replaces it with x(...) > - finds that again x is an object like macro, but recognizes that it > already participated in expansion, so doesn't replace x by alt_x a > second time.
Why do you think that x has already participated in expansion? It hasn't paricipated in the expansion of the function-like macro alt_x, which is what is being considered, if I'm reading c99 right, because no nested replacement of x occurred within the processing of alt_x(). It's a different scan. -- Daniel Jacobowitz CodeSourcery