0

一番下に答えました。ありがとう!

コンパイラは、リリース バージョンでエラー C2039 および C2065 を正しくキャッチしました。

同じコードがデバッグ バージョンでコンパイルに合格できるのはなぜですか?

これはマイクロソフトの既知のバグですか?

DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC で問題が解決することはわかっています。しかし、それらがなければ、なぜ Microsoft は私のデバッグ バージョンでコンパイルに合格したのでしょうか? これが質問です。


理由が判明。マイケルの答えは正確です。_AFXDLL は、私のデバッグ構成でのみ定義されています。したがって、デバッグ バージョンでは、マクロ RUNTIME_CLASS を展開するときに CObject::GetThisClass を使用しています。

したがって、次のコードは、DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC が宣言されていない場合、リリース バージョンとデバッグ バージョンの両方でコンパイラ エラーが発生します。

CRuntimeClass* p = (CRuntimeClass*) (&XXX::classXXX);

ただし、次のコードは、_AFXDLL が事前定義されていない場合にのみ失敗します。

p->IsKindOf(RUNTIME_CLASS(XXX))

ありがとう

4

1 に答える 1

1

おそらく、デバッグ プロジェクト構成が MFC DLL ランタイムにリンクしているのに対し、リリース構成は静的 MFC ランタイムにリンクしていることが原因です。MFC DLL に対してビルドする場合、マクロが定義されているため (MFC DLL が使用されていることを示します) 、CObjectベース オブジェクト定義でafx.h次の行が有効になります。_AFXDLL

#ifdef _AFXDLL
    static CRuntimeClass* PASCAL _GetBaseClass();
    static CRuntimeClass* PASCAL GetThisClass();
#endif

したがって、_AFXDLLが定義されると、 から派生したすべてのオブジェクトCObjectが静的GetThisClass()関数を取得RUNTIME_CLASS()しますDECLARE_DYNAMIC()

_AFXDLLが定義されていない場合、GetThisClass()関数は宣言されていませCObjectん。クラスの関数を取得するには、DECLARE_DYNAMIC()マクロを使用IMPLEMENT_DYNAMIC()して定義を取得する必要があります。

したがって、違いはおそらくデバッグとリリースではなく、MFC DLL と MFC 静的ランタイムの違いです。

于 2013-06-26T07:34:04.010 に答える