Reputation: 63816
#define PACKAGE Package123
#define TEST_SUITE_NAME_PACKAGE(Suite,Package) Suite##_##Package
#define TEST_SUITE_NAME(Suite) TEST_SUITE_NAME_PACKAGE(Suite,PACKAGE)
#define SUITE_NAME TEST_SUITE_NAME(UtilitiesTest)
I want SUITE_NAME
to evaluate to UtilitiesTest_Package123
, but after many variations, I still get UtilitiesTest_PACKAGE
.
Note: SUITE_NAME
is to be used as an identifier, not a string. I messed around with #
and ##
operators, but nothing seems to work.
Upvotes: 1
Views: 73
Reputation: 17956
The preprocessor sometimes requires a surprising number of indirections:
#define PACKAGE Package123
#define PASTE(x,y) x##_##y
#define TEST_SUITE_NAME_PACKAGE(Suite,Package) PASTE(Suite,Package)
#define TEST_SUITE_NAME(Suite) TEST_SUITE_NAME_PACKAGE(Suite,PACKAGE)
#define SUITE_NAME TEST_SUITE_NAME(UtilitiesTest)
This PASTE
approach is a common preprocessor trick for just this sort of situation.
Upvotes: 1
Reputation: 70981
Just add another level of indirection
#define PACKAGE Package123
#define TEST_SUITE_NAME_PACKAGE(Suite,Package) Suite##_##Package
#define _TEST_SUITE_NAME_PACKAGE(Suite, PACKAGE) TEST_SUITE_NAME_PACKAGE(Suite,PACKAGE)
#define TEST_SUITE_NAME(Suite) _TEST_SUITE_NAME_PACKAGE(Suite,PACKAGE)
#define SUITE_NAME TEST_SUITE_NAME(UtilitiesTest)
Upvotes: 0