Mr. Boy
Mr. Boy

Reputation: 63816

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?

Upvotes: 11

Views: 8650

Answers (3)

James Kanze
James Kanze

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

brian beuning
brian beuning

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

Jonathan Wakely
Jonathan Wakely

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

Related Questions