默认情况下,在Visual Studio中从项目中删除安全警告(_CRT_SECURE_NO_WARNINGS)


195

是否有一种方法可以为所有项目默认设置,以消除使用scanf()之类的函数时出现的预编译器安全警告。我发现您可以通过在项目选项或#define _CRT_SECURE_NO_WARNINGS代码开头添加一行来实现。

我发现自己反复创建新项目来解决编程竞赛,添加以下内容确实很烦人(并且花费了宝贵的时间):

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

在代码的开头,或者在每次启动新项目时在预编译器选项中进行设置。


2
您可以导出定义了_CRT_SECURE_NO_WARNINGS的项目模板。
BlueWanderer 2013年

这似乎是一个不错的解决方法。我正在调查。谢谢!
Juan Martinez

3
您会忘记最后的1 #define _CRT_SECURE_NO_WARNINGS 1
Martijn van Wezel

3
不需要@MartijnvanWezel 1结尾。
qqqqq

1
@qqqqq这将迫使是真实的
的Martijn凡韦策尔

Answers:


286

在解决方案资源管理器中标记所有所需的项目。

按Alt-F7或在解决方案资源管理器中单击鼠标右键,然后选择“属性”

配置:所有配置

单击“预处理器定义”行以调用其编辑器

选择编辑...

将“ _CRT_SECURE_NO_WARNINGS”复制到顶部的“预处理程序定义”白框中。

在此处输入图片说明


10
这描述了如何为我认为OP已经知道的一个项目添加它(尽管还不是100%清晰)。关键问题是如何添加它以便它出现在所有项目中。理想情况下,如何将其添加到%(PreprocessorDefinitions)宏,以便将其包含在所有地方?
罗布·吉列姆

固定于2015

这仅描述了第一步。一旦按照需要配置了所有内容,就需要导出项目模板(请参阅如何:创建项目模板以获取说明)。
IInspectable

91

可能是因为我还是VS的新手,但绝对是C的新手,但是允许我构建的唯一一件事就是添加

#pragma warning(disable:4996)

在文件的顶部,这抑制了我使用sprintf遇到的C4996错误

有点烦人,但对于我的一小段代码来说却是完美的选择,并且到目前为止是最简单的。

我在这里读到了它:https : //msdn.microsoft.com/en-us/library/2c8f766e.aspx


5
我尝试了此页面上显示的#define的所有变体(末尾带有和不带有1),只有#pragma对我有用。(VS2013社区版)我确定我丢失了一些东西,但是在某些时候,您只需要它可以工作即可继续使用。
Spike0xff

完全一样的东西-感觉很糟糕,但是到了最后,很好,它工作了@ Spike0xff
Shaun314 2015年

2
我可以确认_CRT_SECURE_NO_WARNINGS在VC ++ 2015中不起作用,但可以正常工作。谢谢!
Shital Shah

@ShitalShah您的确认是基于个人实验还是Microsoft的一些官方文档?
qqqqq

1
@bri:无条件设置默认值会产生不良影响。您确实打算将行为恢复到以前的状态。为此,请使用#pragma warning(push)/#pragma warning(pop)代替。
IInspectable

29

不是自动的,不。你可以创建一个项目模板作为BlueWandered建议创建一个自定义属性表,您可以使用您当前和将来的所有项目。

  1. 打开属性管理器(“视图”->“属性管理器”)
  2. 在属性管理器中,右键单击您的项目,然后选择“添加新项目属性表”
  3. 给它起一个名字并在公共目录中创建它。属性表将添加到所有构建目标。
  4. 右键单击新的属性表,然后选择“属性”。这将打开属性,并允许您更改设置,就像为项目编辑它们一样。
  5. 进入“通用属性-> C / C ++->预处理器”
  6. 编辑设置“预处理程序定义”并添加_CRT_SECURE_NO_WARNINGS
  7. 保存,就完成了。

现在,无论何时创建新项目,都可以像这样添加此属性表...

  1. 打开属性管理器(“视图”->“属性管理器”)
  2. 在属性管理器中,右键单击您的项目,然后选择“添加现有项目属性表”

这样做的好处是,您不仅可以在一个地方管理通用设置,而且在任何时候更改设置,它们都会传播到使用它的所有项目中。如果您有很多_CRT_SECURE_NO_WARNINGS要在项目中使用的设置(例如Boost)或库(例如Boost),这将很方便。


棒极了。我不敢相信直到今天才发现物业经理。
詹姆斯·约翰斯顿

20

此处的所有解决方案都无法在我的VS2013上运行,但是我将#define _CRT_SECURE_NO_WARNINGSstdafx.h 放在了stdafx.h中,#pragma once并且在禁止所有警告之前。注意:我仅出于原型目的进行编码以支持我的研究,因此请确保您在编写代码时了解此方法的含义。

希望这可以帮助


1
位置在哪里stdafx.h
SomethingThing

1
对于不知道的人,应将其定义为1,如下所示:#define _CRT_SECURE_NO_WARNINGS 1
kirk.burleson15年

11

我对VS 2017的两分钱:

我可以通过以下两种方式在stdafx.h中确认它可以正常工作:

一个)

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1 

b)

#define _CRT_SECURE_NO_WARNINGS 1 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1 
#pragma once

(我为MSDN网络调用添加了另一个定义。)当然,我确实更喜欢a)。

我可以确认:#定义_CRT_SECURE_NO_WARNINGS(无值)不NOT WORK。

PS的真正目的是将这些定义放在函数声明之前,即* .h之前


也可以在Visual Studio 2010中使用。
ebyrob

8

只需复制“ _CRT_SECURE_NO_WARNINGS ”粘贴到项目->属性-> c / c ++->预处理器->预处理器定义上, 单击确定即可。


0

如果您的项目不使用stdafx.h,则可以将以下几行作为.cpp文件的第一行,并且编译器警告应该消失了-至少在Visual Studio C ++ 2008中对我来说是这样。

#ifdef _CRT_SECURE_NO_WARNINGS
#undef _CRT_SECURE_NO_WARNINGS
#endif
#define _CRT_SECURE_NO_WARNINGS 1

可以在它们前面有注释和空白行是可以的。


0

即使您可以将_CRT_SECURE_NO_WARNINGS添加到项目的属性中,最简单的方法是使用stdafx.h进行任何类型的警告和错误禁用,只需确保在以下行(和类似行)之前

#pragma once

同样,只要定义了_CRT_SECURE_NO_WARNINGS,就不需要定义一个值(即“ 1”)。所以它应该看起来像这样:

#define _CRT_SECURE_NO_WARNINGS 

#pragma once

这是不正确的。顺序没有影响。完全没有 我假设您从未解释过,为什么这样做是必要的,因为没有理由。
IInspectable '19

这与“顺序”无关,只需仔细检查:如果将#define _CRT_SECURE_NO_WARNINGS放在#pragma之后一次,您仍然会收到此错误!
迈克尔·海弗拉蒂

的行为是#pragma once由实现定义的,但是遵循Visual Studio中的通用实际标准。如果对您有所帮助,无论您是在编译前还是在编译后定义了预处理器符号,那么您的项目配置都将损坏(这是假设您-过度地将- “ precompiled headers”“ stdafx.h等同于
IInspectable,

“中断的项目配置”甚至是什么意思?我创建了一个新的Win32项目并测试了这两种情况。
Michael Haephrati,

请查看官方文档,以了解使用此预处理器符号的真正要求。
IInspectable,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.