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

Reply via email to