为什么RUMTIME_CLASS在VS2008 Debug版本中没有“DECLARE_DYNAMIC”的情况下通过编译?

时间:2013-06-26 06:38:19

标签: c++ mfc compilation debug-build

在底部回答。谢谢!

编译器在发行版中正确捕获了错误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))

由于

1 个答案:

答案 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静态运行时差异。