2012-12-11 55 views
1

我最近從Visual Studio 2010切換到Visual Studio 2012.我正在使用的項目使用MiLi中的BitwiseEnums庫。根據here的說明,我只包含BitwiseEnums庫,所以添加到我的項目中的唯一文件是bitwise_enums.hoaidl.h(319):錯誤C2057:預期的常量表達式

在VS2010中我沒有問題。在VS2012我收到以下錯誤消息,每當我#包括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的原因?
+0

我檢查了Visual Studio 2010中的oaidl.h,它包含完全相同的行。 – JBentley

回答

0

我已經設法縮小到bitwise_enums.h和Windows.h之間的某種類型的命名衝突,這也是我在項目中包括的。我注意到,如果我包含整個MiLi庫,我沒有得到錯誤,因爲mili.h將所有內容放在名稱空間中,使用#define NAMESPACE_BEGIN#define NAMESPACE_END,而以建議的here的方式定義它們意味着bitwise_enums.h的內容結束污染全球名稱空間。我仍然不清楚爲什麼會導致問題,因爲我似乎無法找到衝突,我也不清楚它爲什麼在VS2010中起作用。但是,我能夠通過改變#定義說明,以便他們裏面創建bitwise_enums.h命名空間來解決這個問題:

#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(可能是不太可能的組合) !