1

最近、VisualStudio2010からVisualStudio2012に切り替えました。作業中のプロジェクトでは、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の間のある種の名前の競合に絞り込むことができました。これもプロジェクトに含めました。#define NAMESPACE_BEGINmili.hはandを使用して名前空間内にすべてを配置するのに対し、ここ#define NAMESPACE_ENDで提案されている方法で定義すると、bitwise_enums.hのコンテンツが汚染されるため、MiLiライブラリ全体を含めてもエラーが発生しないことに気付きました。グローバル名前空間。衝突を特定できないように見えるため、これが問題を引き起こす理由についてはまだ完全にはわかりません。また、VS2010で機能した理由もわかりません。ただし、#define命令を変更して、bitwise_enums.h内に名前空間を作成することで解決できました。

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

もう1つの解決策は、mili.hを含めて、このリンクの2番目の提案に従うことですが、必要なライブラリは1つだけなので、不要なライブラリを除いて、個別に多くの行を用意する必要はありません。

VS2012にWindows.hを含めながら(おそらくありそうもない組み合わせ)、MiLiから単一のライブラリを含めるという特定の方法を使用して、将来誰かが私と同じあいまいな状況に陥った場合に、この回答が役立つことを願っています!

于 2012-12-13T19:35:45.460 に答える