【发布时间】:2010-09-12 06:50:56
【问题描述】:
禁用通过_CRT_SECURE_NO_DEPRECATE 生成的警告的最佳方法是什么,以便轻松恢复它们并适用于 Visual Studio 版本?
【问题讨论】:
标签: c++ visual-studio visual-c++
禁用通过_CRT_SECURE_NO_DEPRECATE 生成的警告的最佳方法是什么,以便轻松恢复它们并适用于 Visual Studio 版本?
【问题讨论】:
标签: c++ visual-studio visual-c++
如果您不想污染源代码(毕竟此警告仅在 Microsoft 编译器中出现),请通过“项目”->“属性”->“配置属性”将 _CRT_SECURE_NO_WARNINGS 符号添加到项目设置中->“C/C++”->“预处理器”->“预处理器定义”。
您也可以在包含生成此警告的头文件之前定义它。 你应该添加这样的东西
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
请注意,请确保您了解此警告的含义,如果您不打算使用 MSVC 以外的其他编译器,请考虑使用更安全的函数版本,即 strcpy_s 而不是 strcpy。
【讨论】:
您可以在警告出现的地方暂时禁用警告
#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)
因此您不会禁用所有警告,这有时可能是有害的。
【讨论】:
#pragma warning(supress: warning-code) 如果只有一个(以下)行使用了已弃用的函数。
suppress 有两个 p
我在一个多平台项目上工作,所以我不能使用 _s 函数,我不想用 Visual Studio 特定代码污染我的代码。
我的解决方案是禁用 Visual Studio 项目中的警告 4996。转到项目 -> 属性 -> 配置属性 -> C/C++ -> 高级 -> 禁用特定警告添加值 4996。
如果您还使用 mfc 和/或 atl 库(不是我的情况)在 include mfc _AFX_SECURE_NO_DEPRECATE 之前和 include atl _ATL_SECURE_NO_DEPRECATE 之前定义。
我在 Visual Studio 2003 和 2005 中使用此解决方案。
附言如果您仅使用 Visual Studio,则安全模板重载可能是一个很好的解决方案。
【讨论】:
*_s 函数不是 Microsoft 特定的。它们被称为边界检查接口,它们是 C/C++ 标准的一部分。见ISO/IEC TR 24772。 Glibc 的人决定不实现它们。
您也可以使用Secure Template Overloads,它们将帮助您在任何可以轻松推断缓冲区大小(静态数组)的地方用安全调用替换不安全调用。
只需添加以下内容:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
然后使用 _s 函数手动修复剩余的警告。
【讨论】:
@[macbirdie] 和@[Adrian Borchardt] 答案的组合。事实证明这在生产环境中非常有用(不会弄乱先前存在的警告,尤其是在跨平台编译期间)
#if (_MSC_VER >= 1400) // Check MSC version
#pragma warning(push)
#pragma warning(disable: 4996) // Disable deprecation
#endif
//... // ...
strcat(base, cat); // Sample depreciated code
//... // ...
#if (_MSC_VER >= 1400) // Check MSC version
#pragma warning(pop) // Renable previous depreciations
#endif
【讨论】:
对于逐个警告的警告,明智的做法是在某个时候将其恢复为默认值,因为您是根据具体情况进行操作的。
#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */
【讨论】:
执行此操作的最佳方法是进行简单的检查和评估。我通常会这样做:
#ifndef _DEPRECATION_DISABLE /* One time only */
#define _DEPRECATION_DISABLE /* Disable deprecation true */
#if (_MSC_VER >= 1400) /* Check version */
#pragma warning(disable: 4996) /* Disable deprecation */
#endif /* #if defined(NMEA_WIN) && (_MSC_VER >= 1400) */
#endif /* #ifndef _DEPRECATION_DISABLE */
真正需要的是以下内容:
#pragma warning(disable: 4996)
还没有让我失望;希望这会有所帮助
【讨论】:
您可以禁用安全检查。去
项目 -> 属性 -> 配置属性 -> C/C++ -> 代码生成 -> 安全检查
并选择禁用安全检查 (/GS-)
【讨论】:
您可以定义 _CRT_SECURE_NO_WARNINGS 符号来抑制它们并取消定义它以恢复它们。
【讨论】:
另一个迟到的答案...这是 Microsoft 在其 wchar.h 中使用它的方式。请注意,他们还禁用了Warning C6386:
__inline _CRT_INSECURE_DEPRECATE_MEMORY(wmemcpy_s) wchar_t * __CRTDECL
wmemcpy(_Out_opt_cap_(_N) wchar_t *_S1, _In_opt_count_(_N) const wchar_t *_S2, _In_ size_t _N)
{
#pragma warning( push )
#pragma warning( disable : 4996 6386 )
return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t));
#pragma warning( pop )
}
【讨论】: