oaidl.h(319):错误C2057:预期的常量表达式

时间:2012-12-11 20:02:18

标签: c++ enums compiler-errors visual-studio-2012

我最近从Visual Studio 2010切换到Visual Studio 2012.我正在处理的项目使用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

我的问题是:

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

1 个答案:

答案 0 :(得分:0)

我已经设法将其缩小到bitwise_enums.h和Windows.h之间的某种命名冲突,我也在项目中包含了这种冲突。我注意到,如果我包含整个MiLi库,我没有得到错误,因为mili.h使用#define NAMESPACE_BEGIN#define NAMESPACE_END将所有内容放在命名空间内,而以建议的方式定义它们{{3 ,意味着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并遵循here,但由于我只需要一个库,所以我不希望单独排除许多行,不包括我不想要的库。

希望这个答案将有用,如果将来的任何人最终都处于与我自己相同的模糊状态,使用包含来自MiLi的单个库的特定方法,同时还包括VS2012中的Windows.h(可能是不太可能的组合)!