禁用通过_CRT_SECURE_NO_DEPRECATE生成的警告
禁用通过_CRT_SECURE_NO_DEPRECATE
生成的警告的最佳方法是什么,可以轻松恢复它们,并且可以跨Visual Studio版本使用?
如果你不想污染你的源代码(毕竟这个警告只提供给Microsoft编译器),通过“Project” – >“Properties” – >“Configuration properties” – >“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特定的代码。
我的解决scheme是禁用Visual Studio项目的警告4996。 转到项目 – >属性 – >configuration属性 – > C / C ++ – >高级 – >禁用特定警告添加值4996。
如果你也使用mfc和/或atl库(不是我的情况),在include mfc _AFX_SECURE_NO_DEPRECATE之前和包含atl _ATL_SECURE_NO_DEPRECATE之前定义。
我在Visual Studio 2003和2005中使用这个解决scheme。
如果你只使用Visual Studio,安全的模板重载可能是一个很好的解决scheme。
您也可以使用安全模板重载 ,它们将帮助您在任何可以轻松推导缓冲区大小(静态数组)的地方使用安全的呼叫replace不安全的呼叫。
只需添加以下内容:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
然后使用_s函数手动修复剩余的警告。
@ [macbirdie]和@ [Adrian Borchardt]的结合答案。 这certificate在生产环境中非常有用(而不是搞乱以前存在的警告,特别是在跨平台编译期间)
#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
最好的方法是通过简单的检查和评估。 我通常做这样的事情:
#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)
还没有让我失望; 希望这可以帮助
对于警告情况下的警告,在某些情况下将其恢复到默认状态是明智的,因为您是在逐个案例的基础上进行的。
#pragma warning(disable: 4996) /* Disable deprecation */ // Code that causes it goes here #pragma warning(default: 4996) /* Restore default */
您可以禁用安全检查。 去
项目 – >属性 – >configuration属性 – > C / C ++ – >代码生成 – >安全检查
并select禁用安全检查(/ 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 ) }