Re: Macro expansion and the preprocessor

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 14 January 2011 17:55, Adam Mercer wrote:
>
> So it seems that the expansions aren't be done as I would expect them to be.
>
> Can anyone see what I'm doing wrong?

If you use the -E option to gcc it will print the preprocessor output,
so you can see what it's doing.

Life will be much easier if you keep your example much simpler, until
you get the macros working e.g.

$ cat test.c
#define TYPE COMPLEX16
#define GTYPE TYPE##Grid
GTYPE g;
#undef TYPE

Now you can see what's happening

$ gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"


TYPEGrid g;


The problem is that the ## operator doesn't expand its arguments, so
TYPE is used verbatim.

You need to add some levels of indirection, so that GTYPE expands to a
macro which expands TYPE, and passes that to another macro which does
the concatenation.

$ cat test.c
#define TYPE COMPLEX16
#define DO_JOIN2(a, b) a##b
#define JOIN2(a, b) DO_JOIN2(a, b)
#define GTYPE JOIN2(TYPE, Grid)
GTYPE g;
#undef TYPE


$ gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"




COMPLEX16Grid g;


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux