编译遇到C4251的警告在网上百度一下后整理如下
警告描述:
class"xxx"需要dll接口
原因和解决办法:
(一)、如果该类(xxx)的定义里面仅含有编译器内置的类型变量,如int、float等,或者成员函数仅使用了这些变量作为参数,那么只需要直接导出该类即可。
class _declspec(dllexport) classname
{}
(二)、如果该类(YourClass)使用了其他类(otherClass),那么这个类(OtherClass)最好也导出,不然编译会出现警告(warning:needs to have dll-interface)
class __declspec(dllexport) YourClass
{
OtherClass m_data;// warning c4251
}
解决办法:在OtherClass定义的地方加上(_declspec(dllexport))
class __declspec(dllexport) OtherClass
{
}
(三)、类内使用了STL模板的时候也会出现C4251警告,不过情况会有所不同
class __declspec(dllexport) YourClass
{
std::vector<int> m_data;//这里会出现警告,因为std::vector<int>类型没有被导出
}
上面使用的模板代码(无论是STL模板还是自定义模板),编译时dll时都会出现C4251警告,但是dll的使用方却不会出现链接错误。这是因为dll的使用方哪里也有一套模板的定义,当他们使用那个std::vector<int>的时候,虽没导出,但是用户自己也有一套STL模板(或者自定义模板),用户会利用自己的模板实例化这个dll中没有导出的东西。
所以,对于使用了STL(或模板)出现的C4251警告,关闭之即可:
#pragma warning(disable:4251)
如不想通过关闭警告的方式关闭警告,那么将类导出即可。
对于自定义模板
template class DLLImportExportMacro MySelfTemplate<int>;
MySelfTemplate<int> y;
对于STL的模板
template class DLLImportExportMacro std::allocator<int>;
template class DLLImportExportMacro std::vector<int,std::allocator<int>>;
std::vector<int> y;

浙公网安备 33010602011771号