76

禁用生成的警告的最佳方法是什么_CRT_SECURE_NO_DEPRECATE,可以轻松恢复它们并且可以跨 Visual Studio 版本工作?

4

10 回答 10

105

如果您不想污染源代码(毕竟此警告仅在 Microsoft 编译器中出现),_CRT_SECURE_NO_WARNINGS请通过“项目”->“属性”->“配置属性”->“C/C++”将符号添加到项目设置中"->"预处理器"->"预处理器定义"。

您也可以在包含生成此警告的头文件之前定义它。你应该添加这样的东西

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

只是一个小评论,确保你理解这个警告代表什么,也许,如果你不打算使用除 MSVC 之外的其他编译器,考虑使用更安全的函数版本,即 strcpy_s 而不是 strcpy。

于 2008-09-23T08:06:15.760 回答
49

您可以在警告出现的地方暂时禁用警告,方法是使用

#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)

所以你不要禁用所有警告,这有时可能是有害的。

于 2008-09-23T15:01:02.440 回答
8

我在一个多平台项目上工作,所以我不能使用 _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,则安全模板重载可能是一个很好的解决方案。

于 2008-09-23T10:58:17.577 回答
6

您还可以使用Secure Template Overloads,它们将帮助您在任何可以轻松推断缓冲区大小(静态数组)的地方用安全调用替换不安全调用。

只需添加以下内容:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

然后使用 _s 函数手动修复剩余的警告。

于 2008-09-23T09:27:03.537 回答
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
于 2013-06-13T18:30:12.960 回答
3

对于逐个警告案例的警告,明智的做法是在某个时候将其恢复为默认值,因为您是根据具体情况进行操作的。

#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */
于 2013-01-08T23:25:33.373 回答
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)

还没有让我失望;希望这可以帮助

于 2013-01-01T03:42:02.583 回答
2

您可以禁用安全检查。去

项目 -> 属性 -> 配置属性 -> C/C++ -> 代码生成 -> 安全检查

并选择禁用安全检查 (/GS-)

于 2014-12-17T04:42:21.213 回答
1

您可以定义 _CRT_SECURE_NO_WARNINGS 符号来抑制它们并取消定义它以恢复它们。

于 2008-09-23T07:38:58.057 回答
0

另一个迟到的答案......这是微软在他们的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 )
} 
于 2015-09-30T06:04:13.200 回答