为什么MSVC10忽略了我的#pragma warning(disable: 4251)?

3

因此,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>          ]

任何帮助都将不胜感激。

你在头文件中添加了 #pragma 吗?这就是导致警告的原因吗?另外,如果头文件正在预编译,你可能需要重新构建预编译头文件。 - undefined
2个回答

3
根据我的经验,有两个问题需要注意:当它是DLL导入时和当它是DLL导出时。
1. 如果是dll导出(dllexport),微软似乎会忽略#pragma warning,但这只是一个项目,可以很容易地将其放入编译器设置中以忽略此警告。我发现如果你把它放在那里,微软就不会发出警告。
2. 如果是dll导入(即使用您的头文件的文件),我发现微软不会忽略#pragma,并且不会发出警告,因此在两个地方都放置它将修复您的问题。
我猜测,79个成功抑制警告的项目可能是不是DLL本身。
警告可能是有原因的,因为如果客户端库使用了不同版本的boost,甚至是不同的编译器设置,它可能会出错。

1
谢谢你的建议。我知道警告可能有其原因,但使用任何类型的模板代码会使得这个警告更像一群苍蝇(令人讨厌且使其他问题难以识别),而不是它本身的严重威胁。 - undefined
如果您在头文件中加入#pragma来抑制警告,那么为了使其仅限于您自己的文件而不干扰其他您希望保留警告的头文件,使用#pragma push和#pragma pop将是“礼貌”的做法。 - undefined

0
据我所知,有些错误是无法禁用的。链接器就是这样。因此,我认为某些编译器也是如此。但总的来说,我会将它放在您的stdafx.h文件中,或者至少放在它之前。放在之后并不能保证任何事情,特别是因为我们看不到您的代码。
[编辑]
另一方面,这是一个严重的警告,如果我是你,我会修复它,而不仅仅忽视它。如果你在这里在stackoverflow上搜索,你会找到一些关于为什么它是个问题的很好的讨论。

1
放置在#include "stdafx.h"之前的任何内容都将被忽略。最好将其放置在stdafx.h文件的开头位置。 - undefined
我不能再贴更多的代码了,因为80个项目中有79个可以很好地抑制警告,只有最后一个似乎无法做到。我还没有看到关于这个警告的任何严肃讨论,我也知道某些STL模板是不能导出的,比如map。如果你有任何关于这个问题的好讨论链接,我会很愿意阅读。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接