禁用生成的警告的最佳方法是什么_CRT_SECURE_NO_DEPRECATE
,可以轻松恢复它们并且可以跨 Visual Studio 版本工作?
10 回答
如果您不想污染源代码(毕竟此警告仅在 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)
所以你不要禁用所有警告,这有时可能是有害的。
我在一个多平台项目上工作,所以我不能使用 _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 中使用这个解决方案。
ps 如果您仅使用 Visual Studio,则安全模板重载可能是一个很好的解决方案。
您还可以使用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 符号来抑制它们并取消定义它以恢复它们。
另一个迟到的答案......这是微软在他们的wchar.h
. 请注意,他们还禁用了警告 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 )
}