Visual Studio 2015无法抑制错误C4996。

5

在使用Visual Studio 2015社区版进行调试编译时,会出现以下错误,但在发布编译时不会出现:

std::copy::_Unchecked_iterators::_Deprecate': Call to 'std::copy' with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'

我能够追溯到我使用的第三方库中的214和242行,这是导致错误的源头。我不完全理解这些部分正在发生什么,所以我宁愿不去碰它。


我正在尝试禁用这个错误,但是Visual Studio不允许我这样做。我已经尝试了在文档、StackOverflow或其他地方提出的以下解决方案:

  • 在项目设置 > 配置属性 > C/C++ > 高级中的“禁用特定警告”字段中添加4996
  • 在项目设置 > 配置属性 > 调试中的“命令参数”字段中添加/wd4996
  • 在有问题的文件顶部和/或有问题的函数上方添加#pragma warning (disable : 4996)
  • 在项目设置 > 配置属性 > C/C++ > 预处理器中的“预处理器定义”字段中添加_SCL_SECURE_NO_WARNINGS_SCL_NONSTDC_NO_WARNINGS_SCL_OBSOLETE_NO_WARNINGS_SCL_SECURE_NO_WARNINGS_GLOBAL及其组合。
  • 使用#define指令将前一个解决方案中的定义添加到有问题的文件顶部。
  • 使用前缀为/D-D的方式将前一个解决方案中的定义添加到“命令参数”字段中。

但是这些对我都没有解决问题。


为什么Visual Studio一直坚持显示这个错误,可能的原因是什么?


等一下,你试过 #define -D_SCL_SECURE_NO_WARNINGS 吗? - Rakete1111
#pragma warning后面的空格可能会有问题吗?你清理了项目吗?抱歉,只是随便提出一些想法,以防万一 :/ - meepzh
@Rakete1111 如果我尝试这样做,它会告诉我在“-”处“期望标识符”。没有“-”,它仍然会出现错误。 - FWDekker
@meepzh 我已经尝试过在 warning 后面以及冒号周围加上空格,但都没能解决它。清理解决方案和项目,重新构建也无法解决问题。 - FWDekker
你链接的 MSDN 文档页面有一个关于 _ITERATOR_DEBUG_LEVEL 和 Checked Iterators 的特殊说明(以及示例)。 - dxiv
在VS2017中,这似乎仍然是一个问题;更新配置属性对我没有起作用,但#pragma warning确实起了作用。 - Sean Werkema
4个回答

5

define NO_WARN_MBCS_MFC_DEPRECATION


嗨,这需要更多的上下文才能成为一个有用的答案。 - Ben
嗯,不完全是这样,Ben。无论你如何定义宏 - 命令行选项,#define等等,都不太重要。只要定义了它,警告就会消失。 - AnEnglishmanInNorway

1

在预处理器定义中添加 _CRT_NONSTDC_NO_WARNINGS。


1

禁用警告4996对std :: copy警告没有影响。 要抑制此警告,请在源文件顶部放置以下内容:

#define _SECURE_SCL_DEPRECATE 0
#include <algorithm>

0
在您的 stdafx.h 文件中:
#pragma warning( push )
#pragma warning( disable: 4996)
#include <algorithm>
#pragma warning( pop )

在我的电脑上,VS2015更新3可用。


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