【问题标题】:Substitute #defined value in macro在宏中替换 #defined 值
【发布时间】:2026-01-20 20:15:01
【问题描述】:
#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)

我希望SUITE_NAME 评估为UtilitiesTest_Package123,但经过多次变化后,我仍然得到UtilitiesTest_PACKAGE

注意:SUITE_NAME 将用作标识符,而不是字符串。我搞砸了 ### 运算符,但似乎没有任何效果。

【问题讨论】:

  • 这一定是个骗子,但我不知道我要搜索什么!
  • 任何代表 PP concat 的东西。
  • 这行得通吗? Suite ## _ ## Package
  • @alk 我不这么认为,因为我确实想要将它串起来?
  • @John,同样的想法;它也提到了连接。

标签: c++ visual-c++ visual-studio-2008 c-preprocessor


【解决方案1】:

预处理器有时需要数量惊人的间接:

#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)

这种PASTE 方法是针对这种情况的常见预处理器技巧。

【讨论】:

    【解决方案2】:

    只需添加另一个间接级别

    #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)
    

    【讨论】: