禁用通过_CRT_SECURE_NO_DEPRECATE生成的警告

时间:2020-03-06 14:35:03  来源:igfitidea点击:

禁用通过_CRT_SECURE_NO_DEPRECATE生成的警告的最佳方法是什么,该警告可以轻松地将其恢复并在Visual Studio版本中正常工作?

解决方案

我们可以定义_CRT_SECURE_NO_WARNINGS符号以禁止显示它们,并取消定义它以将它们恢复原状。

如果我们不想污染源代码(仅在使用Microsoft编译器提出所有此警告之后),请通过"项目"->"属性"->"配置属性"->"_CRT_SECURE_NO_WARNINGS符号添加到项目设置C / C ++"->"预处理器"->"预处理器定义"。

我们也可以在包含生成此警告的头文件之前定义它。
我们应该添加这样的内容

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

并仅需说明一下,请确保我们理解此警告的含义,并且,也许,如果我们不打算使用MSVC以外的其他编译器,请考虑使用更安全的函数版本,即strcpy_s而不是strcpy。

我们还可以使用安全模板重载,它们将在可能容易推断出缓冲区大小(静态数组)的任何地方,用安全调用替换不安全的调用。

只需添加以下内容:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

然后使用_s函数手动修复剩余的警告。

我从事的是多平台项目,所以我不能使用_s函数,也不想用Visual Studio特定的代码污染我的代码。
我的解决方案是禁用Visual Studio项目上的警告4996. 转到项目->属性->配置属性-> C / C ++->高级->禁用特定警告,添加值4996.
如果我们还使用mfc和/或者atl库(不是我的情况),则在包含mfc _AFX_SECURE_NO_DEPRECATE和包含atl _ATL_SECURE_NO_DEPRECATE之前定义。
我在Visual Studio 2003和2005中使用此解决方案。

p.s.如果仅使用Visual Studio,则安全模板重载可能是一个很好的解决方案。

我们可以使用以下方法暂时禁用警告出现的位置:

#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)

因此我们不会禁用所有警告,这有时可能会有害。