禁用通过生成的警告的最佳方法是什么_CRT_SECURE_NO_DEPRECATE
,它可以使警告轻松恢复并在Visual Studio版本中正常工作?
Answers:
如果您不想污染您的源代码(仅在使用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)
因此您不会禁用所有警告,这有时可能会有害。
#pragma warning(supress: warning-code)
如果只有一行(以下)使用不推荐使用的函数。
suppress
有两个p
我从事的是多平台项目,所以我不能使用_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,则安全模板重载可能是一个很好的解决方案。
*_s
功能不是Microsoft特定的。它们被称为边界检查接口,并且是C / C ++标准的一部分。参见ISO / IEC TR 24772。Glibc人员决定不实施它们。
您还可以使用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)
还没让我失望吗?希望这可以帮助
另一个较晚的答案...这是Microsoft在其中使用它的方式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 )
}