【问题标题】:VS2010 C++ Preprocessor and nested ParenthesesVS2010 C++ 预处理器和嵌套括号
【发布时间】:2015-03-29 00:20:17
【问题描述】:

我正在使用 VS2010 C++ 中的预处理器定义版本字符串。我有以下#defines:

#define IMPORT_VERSION_1_1                      L"IMPORT 1.0"
#define EPAPI_VERSION_1_1                       L"EPAPI 1.1"
#define EPAPI_VERSION_1_2                       L"EPAPI 1.2"
#define EPAPI_VERSION_1_3                       L"EPAPI 1.3"
#define EPAPI_VERSION_ALL_1_2                   (EPAPI_VERSION_1_2 L"," EPAPI_VERSION_1_3)
#define EPAPI_VERSION_ALL_1_2_NoParens          EPAPI_VERSION_1_2 L"," EPAPI_VERSION_1_3
#define EPAPI_VERSION_ALL_1_3                   (EPAPI_VERSION_1_3)

#define Broken                                  (EPAPI_VERSION_ALL_1_2          L"," IMPORT_VERSION_1_1)
#define Works                                   (EPAPI_VERSION_ALL_1_2_NoParens L"," IMPORT_VERSION_1_1)

const wchar_t* sJunk = Broken;

如果我使用 Broken 来初始化 sJunk,我会收到以下错误:

错误 C2143:语法错误:在 'string
之前缺少 ')' 错误 C2059:语法错误:')'

如果我使用 Works,没有错误,我会得到我希望的字符串: EPAPI 1.2,EPAPI 1.3,IMPORT 1.0.

显然这与EPAPI_VERSION_ALL_1_2 的嵌套括号有关。但是,如果可以避免的话,我真的不想删除它们,因为对非括号宏的副作用有据可查。

任何人都可以就如何定义我想要的宏并保留括号提供任何建议吗?

谢谢

【问题讨论】:

    标签: c++ visual-studio-2010 nested c-preprocessor parentheses


    【解决方案1】:

    一个简单的原因产生复杂的结果。让我们解决所有宏:

    Broken
    (EPAPI_VERSION_ALL_1_2 L"," IMPORT_VERSION_1_1)
    ((EPAPI_VERSION_1_2 L"," EPAPI_VERSION_1_3) L"," L"EPAPI 1.1")
    ((L"EPAPI 1.2" L"," L"EPAPI 1.3") L"," L"EPAPI 1.1")
    

    您的代码依赖于这样一个事实,即两个紧随其后的字符串文字被连接起来。这意味着我们可以简化:

    ((L"EPAPI 1.2,EPAPI 1.3") L",EPAPI 1.1")
    

    现在,只剩下两个字符串字面量 - 但它们并不直接相邻!.

    相反,你有任何旧的表达式(你知道,带括号的东西)紧跟一个字符串。编译器宁愿您使用运算符跟进它,或者 - 甚至更好 - 只是关闭另一个括号。这就是编译器消息的来源,它需要 )

    建议的解决方案:

    #define EPAPI_VERSION_ALL_1_2 (EPAPI_VERSION_ALL_1_2_NoParens)
    

    P.S.:由于这种字符串文字连接发生在 Lexer 中,这对于编译器构建器来说实际上很难解决;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      相关资源
      最近更新 更多