Re: C Preprocessor - macro expansion (David Moore)
Mon, 24 May 1993 21:59:09 GMT

          From comp.compilers

Related articles
C Preprocessor - macro expansion (1993-05-24)
Re: C Preprocessor - macro expansion (1993-05-24)
| List of all articles for this month |

Newsgroups: comp.compilers
From: (David Moore)
Keywords: C
Organization: Rational
References: 93-05-112
Date: Mon, 24 May 1993 21:59:09 GMT writes:

> #define x 2
> #define f(a) f(x * (a))
> #define z z [0]

> f(f(z));

>this should macro expand to :

> f(2 * (f(2 * (z [0]))))

>I would like to know the steps I have to go through when macro expanding
>the above example so as to meet the ANSI provisos :

>(i) the replacement sequence is rescanned until all macros have been
> replaced
>(ii) once an identifier has been used in a replacement sequence
> it won't be used again

The key seems to be in the definition of "expansion sequence". It looks
to me as if the term is meant to mean a tree.

For example, you start with f(f(z)) and after the first substitution
(using the fact that inside-out is mandated, you get:

            f (%)

That is, the % is a place holder for the text that is in the
attached subtree.

which you now expand recursively, but with the f definition marked as
unusable. So you get at step 2 (and lumping together both
expansions to save space):

                  | |
                  2 z [0]

Whenever you expand, you inherit the list of used definitions from
the parent and add the expansion you have just used - actually, of
course, you just keep parent links and walk up the tree to determine
what expansions you have already used.

I had no idea C macro expansion was this complicated!

Post a followup to this message

Return to the comp.compilers page.
Search the comp.compilers archives again.