1

我最近从 Visual Studio 2010 切换到 Visual Studio 2012。我正在处理的项目使用 MiLi的BitwiseEnums库。根据此处的说明,我只包括 BitwiseEnums 库,因此添加到我的项目中的唯一文件是bitwise_enums.h

在 VS2010 中我没有问题。在 VS2012 中,每当我 #include bitwise_enums.h 并尝试编译时,我都会收到以下错误消息:

1>c:\program files (x86)\windows kits\8.0\include\um\oaidl.h(319): 
error C2057: expected constant expression

当我检查我的项目的外部依赖项时,它确实列出了文件 oaidl.h。查看此文件,我发现以下语句在第 319 行结束。

typedef /* [v1_enum] */ 
enum tagSF_TYPE
    {
        SF_ERROR    = VT_ERROR,
        SF_I1   = VT_I1,
        SF_I2   = VT_I2,
        SF_I4   = VT_I4,
        SF_I8   = VT_I8,
        SF_BSTR = VT_BSTR,
        SF_UNKNOWN  = VT_UNKNOWN,
        SF_DISPATCH = VT_DISPATCH,
        SF_VARIANT  = VT_VARIANT,
        SF_RECORD   = VT_RECORD,
        SF_HAVEIID  = ( VT_UNKNOWN | VT_RESERVED ) 
    }   SF_TYPE; // Line 319

我的问题是:

  1. 什么是 oaidl.h,是什么导致它包含在我的项目中?
  2. 错误消息是什么意思,我该如何解决?
  3. 仅在 VS2012 中发生此错误的原因可能是什么?
4

1 回答 1

0

我设法将其缩小到 bitwise_enums.h 和 Windows.h 之间的某种命名冲突,我也将其包含在项目中。我注意到,如果我包含整个 MiLi 库,我没有收到错误,因为 mili.h 使用#define NAMESPACE_BEGINand将所有内容放在命名空间中,而按照此处#define NAMESPACE_END建议的方式定义它们,意味着 bitwise_enums.h 的内容最终会污染全局命名空间。我仍然不完全清楚为什么这会导致问题,因为我似乎无法找到冲突,也不清楚为什么它在 VS2010 中有效。但是,我能够通过更改 #define 指令来解决它,以便它们在 bitwise_enums.h 中创建命名空间:

#define NAMESPACE_BEGIN namespace Mili
#define NAMESPACE_END }
#include <bitwise_enums.h>
#undef NAMESPACE_BEGIN
#undef NAMESPACE_END

另一种解决方案是包含 mili.h 并遵循此链接上的第二个建议,但由于我只需要一个库,因此我不希望有很多行单独排除我不想要的库。

如果将来有人最终遇到与我一样的晦涩情况,希望这个答案会很有用,使用包含来自 MiLi 的单个库的特定方法,同时在 VS2012 中包含 Windows.h(可能不太可能的组合)!

于 2012-12-13T19:35:45.460 回答