2013-06-26 30 views
0

在底部回答。謝謝!爲什麼RUMTIME_CLASS在VS2008 Debug版本中沒有「DECLARE_DYNAMIC」通過編譯?

編譯器在發佈版本中正確地捕獲了錯誤C2039和C2065;

我只是好奇,爲什麼相同的代碼可以在調試版本中通過編譯?

這是一個已知的Microsoft錯誤嗎?

我知道DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC將解決這個問題。但是,如果沒有它們,爲什麼微軟在我的調試版本中通過編譯?這是個問題。


已知原因。邁克爾的回答完全正確。 _AFXDLL僅在我的調試配置中定義。因此,在展開宏RUNTIME_CLASS時,Debug版本使用CObject :: GetThisClass。

所以,下面的代碼會被抓住編譯器錯誤的發佈和調試版本,如果DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC沒有宣稱:如果_AFXDLL沒有預先定義

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

但下面的代碼只會失敗。

p->IsKindOf(RUNTIME_CLASS(XXX)) 

感謝

+1

你可以發佈源代碼並顯示錯誤消息的文本嗎? –

+0

錯誤C2039:'classXXXX':不是'XXXX'的成員,錯誤C2065:'classXXXX':未聲明的標識符 – milesma

+1

僅僅是我還是被充斥着沒有任何合理水平的努力的問題放入他們甚至讓他們負責? –

回答

1

一個可能的解釋是,你的調試項目配置鏈接到MFC DLL運行時,而你的版本配置鏈接到MFC靜態運行。當在afx.h構建針對MFC DLL的CObject基礎對象定義具有由於能夠定義的_AFXDLL宏存在(其表示正在使用的MFC DLL)以下行:

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

所以,當被定義_AFXDLL ,從CObject得到的所有對象都會得到一個靜態的GetThisClass()函數,如果沒有DECLARE_DYNAMIC()引入的更好的匹配,那麼RUNTIME_CLASS()會結束調用。

如果沒有定義_AFXDLL,該GetThisClass()功能不CObject聲明 - 讓一個你必須使用DECLARE_DYNAMIC()宏觀和使用IMPLEMENT_DYNAMIC()得到一個定義的類。

所以差異可能不是一個調試VS版本,這是一個MFC DLL與MFC靜態運行時差異。

+0

我不確定你的意思是切換「_DEBUG到NDEBUG」,反之亦然。 –

+0

知道原因。你的回答完全正確。 _AFXDLL僅在我的調試配置中定義。因此,在展開宏RUNTIME_CLASS時,Debug版本使用CObject :: GetThisClass。 – milesma

相關問題