Time slip through our fingers!

三千山

    路漫漫其修远兮,吾将上下而求索

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

编译遇到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;






posted on 2012-03-23 12:15  xueye9  阅读(1532)  评论(0)    收藏  举报
@Baldwin