Reputation: 63816
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?
Upvotes: 11
Views: 8650
Reputation: 154047
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)
Upvotes: 8
Reputation: 2862
Token pasting works with arguments to macros. So try this
#define VERSION XY123
#define PASTE(x) MyApplication_ ## x
#define PRODUCT PASTE(VERSION)
Upvotes: 8
Reputation: 171433
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)
Upvotes: 2