非活动 #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 块中的编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

在 ifdef 中包含预编译的头文件

VS2005中#ifdef XXXX后代码灰色相关智能帮助不可用

#ifdef __cplusplus

#ifdef#ifndef#else#endif执行条件编译

自动删除 Delphi IFDEf 编译器指令

#ifdef MINGW32 然后...不要编译这个