禁用通过_CRT_SECURE_NO_DEPRECATE
生成的警告的最佳方式是什么,可以轻松恢复它们并适用于Visual Studio版本?通过_CRT_SECURE_NO_DEPRECATE生成的禁用警告
回答
如果你不想污染你的源代码(毕竟这个警告只出现在Microsoft编译器中),通过“项目” - >“属性” - >“配置属性”将_CRT_SECURE_NO_WARNINGS
符号添加到你的项目设置中 - >“C/C++” - >“预处理器” - >“预处理器定义”。
您还可以在包含生成此警告的头文件之前对其进行定义。 您应该添加这样的事情
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
而只是一个小的话,一定要明白这是什么警告表示,也许,如果你不打算使用其他的编译器比MSVC,请考虑使用更安全版本的功能,即strcpy_s而不是strcpy。
您可以定义_CRT_SECURE_NO_WARNINGS符号以禁止它们,并取消定义它以将其恢复。
您还可以使用Secure Template Overloads,他们会帮你更换安全的人的不安全调用的任何地方,可以很容易地推断出缓冲区的大小(静态数组)。
只需添加以下内容:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
然后用手解决剩余的警告,使用_s功能。
我工作在一个多平台的项目,所以我不能使用_s函数,我不想污染我的代码与视觉工作室特定的代码。
我的解决方法是禁用visual studio项目的警告4996。转到项目 - >属性 - >配置属性 - > C/C++ - >高级 - >禁用特定警告添加值4996.
如果您还使用mfc和/或atl库(不是我的情况)define include include mfc _AFX_SECURE_NO_DEPRECATE和包含atl _ATL_SECURE_NO_DEPRECATE之前。
我在Visual Studio 2003和2005中使用此解决方案。
ps.s.如果只使用visual studio,那么安全模板重载可能是一个很好的解决方案。
`* _s`函数不是Microsoft特定的。它们被称为边界检查接口,它们是C/C++标准的一部分。参见[ISO/IEC TR 24772](http://www.iso.org/iso/catalogue_detail.htm?csnumber=41542)。 Glibc人决定不实施它们。 – jww 2015-09-30 05:51:31
,他们似乎利用
#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)
所以您不要禁用所有警告,这有时可能危害您可以暂时禁用警告的地方。
做到这一点的最好方法是通过简单的检查和评估。我平时做这样的事情:
#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 */
@ [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
您可以禁用安全检查。去
项目 - >属性 - >配置属性 - > C/C++ - >代码生成 - >安全检查
,并选择禁用安全检查(/ GS-)
另一个迟到的回答..以下是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)
}
- 1. 禁用java ant生成的警告
- 2. Xcode警告 - 无法生成警告
- 3. 禁用关于生成的HTML的Eclipse警告?
- 4. 禁用ACL2中的跳过警告警告
- 5. 禁用Eclipse自动生成文件夹的警告
- 6. 如何仅禁用生成文件的“警告为错误”? (MSBuild)
- 7. 禁用IntelliJ警告
- 8. 禁用PHP警告
- 9. 禁用警告2008
- 10. IntelliJ禁用警告
- 11. 如何禁止此COM通用警告?
- 12. webpack2 | postcss生成警告
- 13. 解决生成警告 -
- 14. 禁用Encode.pm的警告
- 15. 通过头文件在GCC中禁用警告消息?
- 16. 通过MS Outlook发送电子邮件并禁用警告
- 17. xcode7禁用弃用警告
- 18. 生成自动装箱使用警告
- 19. 警告通过版本2.0.1
- 20. 在VIM中禁用警告?
- 21. 警告:EXEC()已禁用
- 22. 禁用所有gcc警告
- 23. 禁用Interop excel警告vb.net
- 24. 如何禁用#pragma警告?
- 25. 禁用所有scons警告
- 26. 禁用绑定警告
- 27. 如何禁用keras警告?
- 28. 禁用覆盖警告C++
- 29. 赛灵思:通用合成警告
- 30. PHP的filter_var()函数生成警告
随着C11和C++ 11级的规格,你应该使用字符串操作例程的_s版本,在任何兼容的编译器。 – 2014-03-07 14:04:37
@PaulWhitehurst:不,他们只是在可选的扩展。 – Deduplicator 2014-05-05 11:15:39