默认情况下,在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.