在底部回答。谢谢!
编译器在 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))
谢谢