Mr. Boy
Mr. Boy

Reputation: 63816

Substitute #defined value in macro

#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

Answers (2)

Joe Z
Joe Z

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

alk
alk

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

Related Questions