我有3个类来构建一个继承链。其中两个类是纯抽象的(IProxy和IDataProxy),第三个类真的“完成工作”(DataProxy)。这些类如下(仅显示con / destructors):
IProxy:
class __declspec(dllexport) IProxy
{
public:
IProxy() {}
virtual ~IProxy() {}
};
IDataProxy:
class __declspec(dllexport) IDataProxy : public IProxy
{
public:
IDataProxy() {}
virtual ~IDataProxy() {}
};
DataProxy标头:
class __declspec(dllexport) DataProxy : public IDataProxy
{
public:
DataProxy();
virtual ~DataProxy() {}
};
DataProxy实施文件:
DataProxy::DataProxy() : m_operationType( eUnknown )
{}
当我使用Microsoft C ++编译器(版本12.00.8804)编译类DataProxy时,我收到以下警告:
warning C4710: function 'virtual __thiscall IDataProxy::~IDataProxy(void)' not inlined
warning C4710: function 'virtual __thiscall IDataProxy::~IDataProxy(void)' not inlined
warning C4710: function 'virtual __thiscall DataProxy::~DataProxy(void)' not inlined
warning C4710: function 'virtual __thiscall DataProxy::~DataProxy(void)' not inlined
我真的不知道这些警告的来源。我从未告诉编译器内联任何东西。我不知道如何摆脱这些警告。
有人能否对这些警告有所了解?非常感谢!
祝你好运, 奥利弗
答案 0 :(得分:4)
通过在类中定义构造函数,您可以隐式添加inline
说明符。虚函数(包括析构函数)没有内联。
然而,警告肯定来自于dllexport
函数必须具有给定(thiscall
)调用约定的事实,因此永远不会内联。如果虚拟成员函数非多态地被称为,则可以内联。这将永远不会出现这种情况。
@MSalters的评论提供了为什么IProxy::~IProxy()
没有发出警告的提示。
要消除警告,请在源文件中定义空的析构函数。
答案 1 :(得分:0)
通过在类中提供析构函数的实现,您要求内联它们。构造函数和成员函数也是如此。
答案 2 :(得分:-2)
http://msdn.microsoft.com/en-us/library/yd3056cz(v=VS.100).aspx
此链接清楚地说明了您需要了解的所有内容。它清楚地说明了警告是什么,它发生的原因以及默认情况下警告是关闭的。如果内联定义,类成员函数将隐式内联。通常需要在提出问题之前付出一些努力 - 例如在编译器的文档中搜索警告编号。