2008-09-23 145 views

回答

100

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

您还可以在包含生成此警告的头文件之前对其进行定义。 您应该添加这样的事情

#ifdef _MSC_VER 
#define _CRT_SECURE_NO_WARNINGS 
#endif 

而只是一个小的话,一定要明白这是什么警告表示,也许,如果你不打算使用其他的编译器比MSVC,请考虑使用更安全版本的功能,即strcpy_s而不是strcpy。

+0

随着C11和C++ 11级的规格,你应该使用字符串操作例程的_s版本,在任何兼容的编译器。 – 2014-03-07 14:04:37

+9

@PaulWhitehurst:不,他们只是在可选的扩展。 – Deduplicator 2014-05-05 11:15:39

1

您可以定义_CRT_SECURE_NO_WARNINGS符号以禁止它们,并取消定义它以将其恢复。

6

您还可以使用Secure Template Overloads,他们会帮你更换安全的人的不安全调用的任何地方,可以很容易地推断出缓冲区的大小(静态数组)。

只需添加以下内容:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

然后用手解决剩余的警告,使用_s功能。

8

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

+2

`* _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

41

,他们似乎利用

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

所以您不要禁用所有警告,这有时可能危害您可以暂时禁用警告的地方。

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) 

没有失败我呢;希望通过警告的情况下这有助于

2

的提醒,这是明智的恢复它在某一点违约,因为你是逐个做它的情况下。

#pragma warning(disable: 4996) /* Disable deprecation */ 
// Code that causes it goes here 
#pragma warning(default: 4996) /* Restore default */ 
4

@ [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 
2

您可以禁用安全检查。去

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

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

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