非活动 #ifdef 块中的编译器错误
Posted
技术标签:
【中文标题】非活动 #ifdef 块中的编译器错误【英文标题】:Compiler error in inactive #ifdef block 【发布时间】:2016-07-23 03:13:30 【问题描述】:我正在开发一个使用 Visual Studio 2013 编译的 C++ 程序,但也需要使用 Visual Studio 2008 编译,两者均处于发布模式。我正在使用 #ifdef
块来添加当时不支持的功能/特性的替代方案。以下代码块只是一个示例:
struct someStruct
#ifdef _VS2008 // defined in preprocessor definition
someStruct()
number = -1;
int number;
#else
int number = -1;
#endif
char* Text;
;
我在int number = -1
行收到以下编译器错误。
错误 C2864: 'someStruct::number' : 只有静态 const 整数数据 成员可以在类中初始化
由于#else
(在本例中为int number = -1
)下的代码块似乎并且应该是非活动的,为什么编译器会生成关于它们的错误?
感谢任何输入!
【问题讨论】:
因为_VS2008
,出乎你的意料,没有定义。顺便说一句,如果您必须支持 C++11 之前的编译器,那么为您采用的每个 C++11 快捷方式编写双重实现并没有多大意义——您只是使代码更难阅读并冒着风险两个实现不同步。
@MatteoItalia 对不起,我没有澄清这一点,但_VS2008
我实际上在预处理器定义中定义了它。我被要求使用 ifdefs,我相信这是因为这个应用程序很少使用,而且每隔几年才更新一次。我想我只需要快速解决这个问题。不过感谢您的建议!
【参考方案1】:
您应该使用_MSC_VER
宏来检测 Visual Studio 版本:
#if (_MSC_VER == 1500)
这里的 1500 表示 VS2008。版本列表为here。
【讨论】:
感谢您的信息。我实际上也找到了该帖子,但我仍然遇到错误。我会用我遇到的错误更新我的问题。【参考方案2】:找到了解决方案。代码块位于 DLL 项目中,主项目包括从中导出的一些标头。我不知道我还必须在主项目中定义_VS2008
。
【讨论】:
以上是关于非活动 #ifdef 块中的编译器错误的主要内容,如果未能解决你的问题,请参考以下文章
VS2005中#ifdef XXXX后代码灰色相关智能帮助不可用