【发布时间】:2015-03-25 03:59:12
【问题描述】:
我正在尝试将#include <vector> 添加到我的 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_s、sprintf_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。