在底部回答。谢谢!
编译器在发行版中正确捕获了错误C2039和C2065;
我只是好奇为什么相同的代码CAN在Debug版本中通过编译?
这是一个已知的Microsoft错误吗?
我知道DECLARE_DYNAMIC / IMPLEMENT_DYNAMIC将解决这个问题。但是,没有它们,为什么Microsoft在我的调试版本中通过编译?这是个问题。
知道原因。迈克尔的答案是完全正确的。 _AFXDLL仅在我的Debug配置中定义。所以在Debug版本上,它在扩展宏RUNTIME_CLASS时使用CObject :: GetThisClass。
如果未声明DECLARE_DYNAMIC / IMPLEMENT_DYNAMIC,则以下代码将发现Release和Debug版本的编译器错误:
CRuntimeClass* p = (CRuntimeClass*) (&XXX::classXXX);
但是,如果没有预先定义_AFXDLL,则以下代码将失败。
p->IsKindOf(RUNTIME_CLASS(XXX))
由于
答案 0 :(得分:1)
可能的解释是,当您的发布配置链接到静态MFC运行时,您的调试项目配置链接到MFC DLL运行时。在针对MFC DLL构建时,由于CObject
宏被定义(表示正在使用MFC DLL),afx.h
中的_AFXDLL
基础对象定义启用了以下行:< / p>
#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()
宏并使用{{ 1}}得到一个定义。
所以差异可能不是调试版本,它是MFC DLL与MFC静态运行时差异。