我最近从Visual Studio 2010切换到了Visual Studio2012。我正在处理的项目使用了BitwiseEnums中的MiLi库。按照here的说明,我仅包含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

我的问题是:
  • 什么是oaidl.h,是什么使它包含在我的项目中?
  • 错误消息是什么意思,如何解决?
  • 仅在VS2012中发生此错误的原因可能是什么?
  • 最佳答案

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

    #define NAMESPACE_BEGIN namespace Mili
    #define NAMESPACE_END }
    #include <bitwise_enums.h>
    #undef NAMESPACE_BEGIN
    #undef NAMESPACE_END
    
    另一种解决方案是包括mili.h并遵循second suggestion at this link,但是由于我只需要一个库,所以我希望不必单独排很多行,而不必使用不需要的库。
    希望如果将来有人遇到与我一样晦涩的情况,并使用包括MiLi中的单个库的特定方法,同时在VS2012中包括Windows.h(可能是不太可能的组合),此答案将很有用!

    09-25 21:27