简体   繁体   中英

Combining two #defined symbols in C++ preprocessor

I want to do:

#define VERSION XY123
#define PRODUCT MyApplication_VERSION

so that PRODUCT is actually MyApplication_XY123. I have tried playing with the merge operator ## but with limited success...

#define VERSION XY123
#define PRODUCT MyApplication_##VERSION

=> MyApplication_VERSION

#define VERSION XY123
#define PRODUCT MyApplication_##(VERSION)

=> MyApplication_(XY123) - close but not quite

Is what I want possible?

Token pasting works with arguments to macros. So try this

#define VERSION XY123
#define PASTE(x) MyApplication_ ## x
#define PRODUCT PASTE(VERSION)

The ## operator acts before argument substitution has taken place. The classical solution is to use a helper:

#define CONCAT2(a, b) a ## b
#define CONCAT(a, b) CONCAT2(a, b)

CONCAT(MyApplication_, VERSION)

All problems in computer science can be solved by an extra level of indirection:

#define JOIN_(X,Y) X##Y
#define JOIN(X,Y) JOIN_(X,Y)
#define VERSION XY123
#define PRODUCT JOIN(MyApplication_,VERSION)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM