禁用通过_CRT_SECURE_NO_DEPRECATE
生成的警告的最佳方法是什么,这些警告可以轻松恢复并且可以在Visual Studio版本中使用?
答案 0 :(得分:103)
如果您不想污染源代码(在所有此警告仅出现在Microsoft编译器之后),请通过“Project” - >“Properties” - >将_CRT_SECURE_NO_WARNINGS
符号添加到项目设置中。 “配置属性” - >“C / C ++” - >“预处理器” - >“预处理器定义”。
此外,您可以在包含生成此警告的头文件之前定义它。 你应该添加这样的东西
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
只是一个小小的评论,请确保您了解此警告代表什么,并且如果您不打算使用其他编译器而不是MSVC,请考虑使用更安全的函数版本,即strcpy_s而不是strcpy。
答案 1 :(得分:45)
您可以使用
暂时在显示警告的位置禁用警告#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)
所以你不要禁用所有警告,这些警告有时会有害。
答案 2 :(得分:8)
我在一个多平台项目上工作,所以我不能使用_s函数,我不想用Visual Studio特定代码污染我的代码。
我的解决方案是禁用visual studio项目上的警告4996。转到项目 - >属性 - >配置属性 - > C / C ++ - >高级 - >禁用特定警告添加值4996.
如果您在包含mfc _AFX_SECURE_NO_DEPRECATE之前以及包含atl _ATL_SECURE_NO_DEPRECATE之前使用mfc和/或atl库(不是我的情况)定义。
我在visual studio 2003和2005中使用这个解决方案。
P.S。如果你只使用visual studio,安全模板重载可能是一个很好的解决方案。
答案 3 :(得分:6)
您还可以使用Secure Template Overloads,它们可以帮助您在任何可以轻松推断缓冲区大小(静态数组)的地方用安全的呼叫替换不安全的呼叫。
只需添加以下内容:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
然后使用_s函数手动修复剩余的警告。
答案 4 :(得分:5)
@ [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
答案 5 :(得分:3)
对于警告案例的警告,最好在某个时候将其恢复为默认值,因为你是根据具体情况进行的。
#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */
答案 6 :(得分:2)
最好的方法是通过简单的检查和评估。我通常做这样的事情:
#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)
还没有让我失望;希望这有帮助
答案 7 :(得分:2)
您可以禁用安全检查。转到
项目 - >属性 - >配置属性 - > C / C ++ - >代码生成 - >安全检查
并选择禁用安全检查(/ GS - )
答案 8 :(得分:1)
您可以定义_CRT_SECURE_NO_WARNINGS符号以禁止它们,并取消定义它以恢复它们。
答案 9 :(得分:0)
另一个迟到的答案......以下是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 )
}