VS2010 C++;预处理器和嵌套括号 我使用VS2010 C++中的预处理器定义版本字符串。我有以下定义:

VS2010 C++;预处理器和嵌套括号 我使用VS2010 C++中的预处理器定义版本字符串。我有以下定义:,c++,visual-studio-2010,nested,c-preprocessor,parentheses,C++,Visual Studio 2010,Nested,C Preprocessor,Parentheses,如果我使用Breake初始化sJunk,会出现以下错误: 错误C2143:语法错误:字符串前缺少“')” 错误C2059:语法错误:')' 如果我使用Works,没有错误,并且我得到了我希望得到的字符串: EPAPI 1.2、EPAPI 1.3、导入1.0 显然,这与EPAPI\u VERSION\u ALL\u 1\u 2的嵌套括号有关。不过,如果可以避免的话,我真的不想删除它们,因为对非括号宏的副作用有很好的记录 有人能就如何定义我想要的宏和保留参数提供一些建议吗 这是一个简单的原因,结果很

如果我使用Breake初始化sJunk,会出现以下错误:

错误C2143:语法错误:字符串前缺少“')”
错误C2059:语法错误:')'

如果我使用Works,没有错误,并且我得到了我希望得到的字符串:
EPAPI 1.2、EPAPI 1.3、导入1.0

显然,这与
EPAPI\u VERSION\u ALL\u 1\u 2
的嵌套括号有关。不过,如果可以避免的话,我真的不想删除它们,因为对非括号宏的副作用有很好的记录

有人能就如何定义我想要的宏和保留参数提供一些建议吗


这是一个简单的原因,结果很复杂。让我们只解析所有宏:

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)
注意:由于这种字符串文字连接是在Lexer中发生的,因此对于编译器构建器来说,这实际上很难解决;)

#define EPAPI_VERSION_ALL_1_2 (EPAPI_VERSION_ALL_1_2_NoParens)