【问题标题】:Why is MSVC10 ignoring my #pragma warning(disable: 4251)?为什么 MSVC10 忽略我的 #pragma 警告(禁用:4251)?
【发布时间】:2011-12-22 01:12:10
【问题描述】:

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

我的问题是,对于特定的课程,“#pragma 警告(禁用: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 放在导致警告的头文件中?另外,如果头文件正在被预编译,你可能需要重新编译你的预编译头文件。

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


【解决方案1】:

根据我自己的经验,有两个问题:什么时候是 DLL 导入,什么时候是 DLL 导出。

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

  2. dllimport 在哪里,即使用您的标头的文件。我在那里发现 Microsoft 不会忽略编译指示并且不会发出警告,因此将它放在这两个地方将解决您的问题。

我的猜测是,抑制警告罚款的 79 个项目是那些不是 DLL 本身的项目。

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

【讨论】:

  • 感谢您的提示。我知道该警告的存在可能是有原因的,但使用任何类型的模板代码都会使该警告更像是一群苍蝇(烦人并且使其他问题难以识别),而不是它本身就是一个严重的威胁。
  • 如果您将#pragma 放入标题中以抑制警告,使用#pragma push 和#pragma pop 在它周围是“礼貌的”,因此它仅对您自己的文件保持本地而不是侵入您可能希望保留警告的其他标题。
【解决方案2】:

据我所知,有些错误是无法禁用的。 Linker 就是这样。因此,我认为某些编译器也是如此。但总的来说,我会把它放在你的 stdafx.h 文件中,或者至少放在它之前。将其放在后面并不能保证任何事情,尤其是因为我们看不到您的代码。

[编辑]

另一方面,这是一个严重的警告,如果我是你,我会修复它,而不仅仅是忽略它。如果你在这里搜索堆栈溢出,你会发现一些关于为什么它是一个问题的精彩讨论。

【讨论】:

  • #include "stdafx.h" 之前的任何内容都将被忽略。最好将它放在 stdafx.h 本身的开头。
  • 我真的不能再发布任何代码了,因为 80 个项目中有 79 个会很好地抑制警告,我似乎无法得到最后一个。我还没有真正看到任何关于警告的严肃讨论,而且我也知道有某些 STL 模板无法导出,例如 map。如果您有任何关于它的良好讨论的链接,我很乐意阅读它们。
猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 2019-10-20
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多