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

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

所以 4251 警告至少是微软编译器的严重基础。本质上,只要您在 header 定义中的任何位置使用模板类或非 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>          ]

如有任何帮助,我们将不胜感激。

最佳答案

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

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

  2. 它是 dllimport,即使用您的 header 的文件。我发现 Microsoft 不会忽略 pragma 并且不会发出警告,因此将它放在两个地方将解决您的问题。

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

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

关于c++ - 为什么 MSVC10 忽略我的#pragma 警告(禁用 : 4251)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8598354/

相关文章:

c - 如何阻止 VS2010 自动包含 Ansi C 项目的文件

c++ - 二维数组重新分配

c++ - Qt keyPressEvent 处理程序仅在按下 ctrl、alt 或 shift 键时使用react

c++ - <stdint.h> 还是标准类型?

C++ 静态库和共享库

c++ - 如何从 ULONGLONG 毫秒创建 SYSTEMTIME 结构?

c++ - Mac 上的 OpenCV Contrib 模块安装

c++ - 使用类旋转图像

c++ - 为什么将 T 从外部模板作为默认参数传递给 std::function 会导致编译错误?

c++ - 如何有选择地为 VS2010 构建 Qt?