为什么MSVC10忽略了我的#pragma警告(禁用:4251)?

时间:2011-12-22 01:12:10

标签: c++ visual-c++ visual-studio-2010

所以4251警告至少是微软编译器的重要基础。基本上,只要您在标头定义中的任何位置使用模板类或非dllexport类,就会收到此警告。更好的是,stl中有许多类(如map),你甚至无法摆脱这个错误,句号。

我的问题是,对于特定的类,“#pragma warning(disable:4251)”只是扁平化不起作用。它在其他地方工作,但在这里。

DelWestInspectionProgram.cpp

#include "stdafx.h"
#pragma warning(disable: 4251)
...

Output Log:
E:\svn\VisionNow\VisionSuite\VI.Inspector.ImageProcessing.Common\BIImage.h(79): warning       C4251: 'BIImage::_data' : class 'boost::shared_array<T>' needs to have dll-interface to be   used by clients of class 'BIImage'
6>          with
6>          [
6>              T=unsigned char
6>          ]
6>E:\svn\VisionNow\VisionSuite\VI.Inspector.ImageProcessing.Operators\BIImageOperator.h(25): warning C4251: 'BIImageOperator::_savePath' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'BIImageOperator'
6>          with
6>          [
6>              _Elem=char,
6>              _Traits=std::char_traits<char>,
6>              _Ax=std::allocator<char>
6>          ]

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

根据我自己的经验,有两个问题:当它是DLL导入时以及它是DLL导出时。

  1. 在dllexport中,Microsoft似乎忽略了#pragma警告,但这只是一个很容易放入编译器设置以忽略此警告的项目。我发现如果你把它放在那里,微软不会发出警告。

  2. 它是dllimport,即使用标题的文件。我发现Microsoft没有忽略该pragma并且没有发出警告,因此将它放在两个位置都可以解决您的问题。

  3. 我的猜测是,79个禁止警告的项目是那些不是DLL本身的项目。

    1. 警告可能有一个原因,即如果您的客户端库使用不同版本的boost,或者甚至是不同的编译器设置,它可能会中断。

答案 1 :(得分:0)

据我所知,有些错误无法被禁用。链接器就是这样。因此我认为它与某些编译器的方式相同。但总的来说,我会将它放在你的stdafx.h文件中,或者至少在它之前。把它放在后面并不保证任何东西,特别是因为我们看不到你的代码。

[编辑]

另一方面,这是一个严重的警告,如果我是你,我会解决,而不是忽略它。如果你在这里搜索堆栈溢出,你会发现一些很好的讨论,为什么它是一个问题。