禁用通过_CRT_SECURE_NO_DEPRECATE生成的警告

时间:2008-09-23 07:28:07

标签: c++ visual-studio visual-c++

禁用通过_CRT_SECURE_NO_DEPRECATE生成的警告的最佳方法是什么,这些警告可以轻松恢复并且可以在Visual Studio版本中使用?

10 个答案:

答案 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 )
}