【问题标题】:Warnings C4995 when adding #include <vector> to MFC project将#include <vector> 添加到 MFC 项目时出现警告 C4995
【发布时间】:2015-03-25 03:59:12
【问题描述】:

我正在尝试将#include &lt;vector&gt; 添加到我的 MFC 项目中。它可以编译,但我收到以下警告(只是其中一些,实际列表要长得多):

1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(49) : warning C4995: 'gets': name was marked as #pragma deprecated
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(53) : warning C4995: 'sprintf': name was marked as #pragma deprecated
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(56) : warning C4995: 'vsprintf': name was marked as #pragma deprecated
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(22) : warning C4995: 'strcat': name was marked as #pragma deprecated
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(23) : warning C4995: 'strcpy': name was marked as #pragma deprecated
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cwchar(36) : warning C4995: 'swprintf': name was marked as #pragma deprecated
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cwchar(37) : warning C4995: 'vswprintf': name was marked as #pragma deprecated
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cwchar(39) : warning C4995: 'wcscat': name was marked as #pragma deprecated
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cwchar(41) : warning C4995: 'wcscpy': name was marked as #pragma deprecated

我可以通过这样做使其静音:

#pragma warning(push)
#pragma warning(disable: 4995)
#include <vector>
#pragma warning(pop)

但我很想知道为什么库会导致这些警告?除了抑制警告之外,是否有更好的方法来解决这个问题?

【问题讨论】:

  • 尝试在您的stdafx.h 中包含任何内容之前添加#define STRSAFE_NO_DEPRECATE。或者将其添加到项目设置中的定义列表中。我不相信这是必要的,因为至少 VS2010。看起来你正在使用 VS2008。 MS 希望您使用上述功能的"safe" 版本(strcat_ssprintf_s 等)。我觉得奇怪的是他们的标准库默认情况下不这样做。您不会混合其他 VS 版本的标准库,对吧?
  • @WhozCraig:我想我不会。我会尝试添加#define STRSAFE_NO_DEPRECATE。问题是知道首先调用stdafx.h 的哪个包含。它们几乎在每个.cpp 文件中。
  • 我的意思是把它放在 in stdafx.h 之前 包含在 stdafx.h 中的任何其他包括,以防不清楚。正如我所说,只编辑项目设置并在 C/C++ 设置下定义的预处理器中设置它(调试和发布构建配置)可能更容易。
  • @WhozCraig:哦,我明白你的意思了。尽管这与我的警告压制类似,但在全球范围内。所以我很好奇如何获得更新版本的std::vector 库,它使用微软在该警告中建议的所有安全 API?
  • 它不会抑制 all 弃用,只会抑制 strsafe 库周围的弃用。其他不相关的弃用仍将被标记。我个人至少会升级到 VS2010 或 VS2013。

标签: c++ stl mfc


【解决方案1】:

此警告表示该功能已被标记为过时,未来版本可能不再支持该功能。

所以你可以有两种方法来处理它:首先是你使用的方式,用 pragma deprecated 标记它,或者你可以使用他们的安全版本。

例如Strcpy有一个对应的函数叫StringCchCopy/StringCbCopy,get有get_s。您可以从 MSDN 中找到它们。

祝你好运。 :)

【讨论】:

  • 谢谢。但我不是在写那个库。这些函数来自std::vector
  • 不使用std::vector这个警告会消失吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多