禁用通过_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 ) }