3

I am having trouble getting this macro expanison right

#define foo Hello
#ifdef foo
#define wrapper(x) foo ## x
#else
#define wrapper(x) boo ## x
#endif

calling:

wrapper(_world)

I would like the result of

Hello_world

however, the macro is treating the "foo" define as a literal, and thus giving

foo_world

Can someone point out my mistake?

Thanks

xceph
  • 1,036
  • 2
  • 13
  • 28
  • possible duplicate of: [C preprocessor and concatenation](http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation) – djf Jun 25 '13 at 17:03

1 Answers1

7

I would recommend gnu-cpp-manual which clearly explains how macros are expanded.

Macro arguments are completely macro-expanded before they are substituted into a macro body, unless they(macro arguments) are stringified or pasted with other tokens (by the macro function that is directly applied to).

For example:

If an argument is stringified or concatenated, the prescan does not occur.

#define AFTERX(x) X_ ## x
#define XAFTERX(x) AFTERX(x)
#define TABLESIZE 1024
#define BUFSIZE TABLESIZE

AFTERX(BUFSIZE) => X_BUFSIZE: since AFTERX is to concatenate argument with prefix, its argument is not expanded, remaining BUFSIZE.

XAFTERX(BUFSIZE) => X_1024: XAFTERX does not do concatenation directly, so BUFSIZE will be expanded first.

Generally, arguments are scanned twice to expand macro called in them.

--- edit ---

So the better practice is: (code from QEMU source)

#ifndef glue
#define xglue(x, y) x ## y
#define glue(x, y) xglue(x, y)
#define stringify(s) tostring(s)
#define tostring(s) #s
#endif

glue(x,y) will concatenate x and y with both already expanded.

styxyang
  • 96
  • 1
  • 4