Related articles |
---|
Complete macro expansion with cpp peter.mathes@gmx.de (2005-02-12) |
Re: Complete macro expansion with cpp RLake@oxfam.org.uk (Rici Lake) (2005-02-13) |
Re: Complete macro expansion with cpp skandgoe@gwdg.de (Skandinavisches Seminar) (2005-02-13) |
Re: Complete macro expansion with cpp codeworker@free.fr (2005-02-16) |
Re: Complete macro expansion with cpp codeworker@free.fr (2005-02-16) |
Re: Complete macro expansion with cpp peter.mathes@gmx.de (peter.mathes@gmx.de) (2005-02-16) |
From: | "Rici Lake" <RLake@oxfam.org.uk> |
Newsgroups: | comp.compilers |
Date: | 13 Feb 2005 22:45:49 -0500 |
Organization: | Compilers Central |
Keywords: | C, macros |
Posted-Date: | 13 Feb 2005 22:45:49 EST |
> When I pre-process the following lines
> #define MACRO1 (1)
> #define MACRO2 (MACRO1)
> using cpp with the option '-dM' it outputs the same lines:
> #define MACRO1 (1)
> #define MACRO2 (MACRO1)
> But I need an output with the macros expanded completely. Something
> like this:
> #define MACRO1 (1)
> #define MACRO2 ((1))
But that is changing the semantics of cpp macros. MACRO2 really
does mean (MACRO1):
rlake@freeb:~$ less cpptest.c
#define MACRO1 (1)
#define MACRO2 (MACRO1)
MACRO2
#undef MACRO1
#define MACRO1 (2)
MACRO2
#undef MACRO1
MACRO2
rlake@freeb:~$ cpp cpptest.c
# 1 "cpptest.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "cpptest.c"
((1))
((2))
(MACRO1)
-----
If that doesn't bother you, you could simply lex the C input, which is
reasonably straightforward, unlike parsing C, and do macro
substitutions using a simple hash table. However, that will miss out
on a number of curious but occasionally useful (and used)
"features". (Note, in particular, the non expansion of MACRO in the
definition of SHOW):
rlake@freeb:~$ less cpptest2.c
#define MACRO1 one
#define MACRO2 two
#define X(a,b) a##b
#define MACRO unexpanded
#define SHOW(i) Macro i is X(MACRO, i)
SHOW(1)
SHOW(2)
rlake@freeb:~$ cpp cpptest2.c
# 1 "cpptest2.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "cpptest2.c"
Macro 1 is one
Macro 2 is two
Return to the
comp.compilers page.
Search the
comp.compilers archives again.