0

在底部回答。谢谢!

编译器在 Release 版本中正确捕捉到错误 C2039 和 C2065;

我只是好奇为什么相同的代码可以在调试版本中通过编译?

这是一个已知的微软错误吗?

我知道 DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC 会解决这个问题。但是,没有它们,为什么微软在我的调试版本中通过编译?这就是问题。


知道原因。迈克尔的回答完全正确。_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 回答