C++ 如何使用CRT\u SECURE\u NO\u警告

C++ 如何使用CRT\u SECURE\u NO\u警告,c++,visual-c++,visual-studio-2012,warnings,C++,Visual C++,Visual Studio 2012,Warnings,我在向导生成的简单MFC窗口应用程序中出现编译错误,有几行代码: 错误C4996:“strncpy”:此函数或变量可能不安全。请考虑使用StncPyIs代替。要禁用弃用,请使用CRT安全警告。有关详细信息,请参阅联机帮助 我设置了配置属性>>C/C++>>预处理器>>预处理器定义>>\u CRT\u nonsdc\u NO\u警告 但这没有帮助。我有另一个非常接近的项目,在这里只生成警告,它没有\u CRT\u nonsdc\u no\u警告定义 项目之间唯一的区别是向导中有几个不同的选项 为什

我在向导生成的简单MFC窗口应用程序中出现编译错误,有几行代码:

错误C4996:“strncpy”:此函数或变量可能不安全。请考虑使用StncPyIs代替。要禁用弃用,请使用CRT安全警告。有关详细信息,请参阅联机帮助

我设置了
配置属性>>C/C++>>预处理器>>预处理器定义>>\u CRT\u nonsdc\u NO\u警告

但这没有帮助。我有另一个非常接近的项目,在这里只生成警告,它没有
\u CRT\u nonsdc\u no\u警告
定义

项目之间唯一的区别是向导中有几个不同的选项

为什么“CRT\u nonsdc\u NO\u警告”在第一个项目中没有帮助,为什么第二个项目在没有此定义的情况下编译时没有问题?

添加方式

配置属性>>C/C++>>预处理器>>预处理器 定义>>\u CRT\u安全\u无警告


如果您在Visual Studio 2012或更高版本中,则在“项目->属性->C/C++->预处理器->预处理器定义”下添加“CRT\U安全\U无警告”

如果您在Visual Studio 2012或更高版本中,则在属性页->C/C++->常规下有一个附加设置“SDL检查”

附加安全开发生命周期(SDL)建议检查;包括启用附加的安全代码生成功能以及作为错误的附加安全相关警告


它默认为YES-这是有原因的,即您应该使用strncpy的安全版本。如果将此更改为“否”,则在使用不安全版本时不会出现错误


\u CRT\u SECURE\u NO\u警告添加到Project->Properties->C/C++->预处理器->预处理器定义中对我不起作用,不知道为什么

以下提示有效: 在stdafx.h文件中,请添加

#define _CRT_SECURE_NO_DEPRECATE

在包含其他头文件之前。

为了快速修复或测试,我发现只需在所有包含之前将
\define\u CRT\u SECURE\u NO\u警告添加到文件顶部就很方便了


我在Visual Studio 2017中遇到了同样的错误,为了修复它,我在
之后添加了
#define#CRT(安全)NO(无)警告
#包括“pch.h”


Visual Studio 2019CMake

将以下内容添加到
CMakeLists.txt

add_definitions(-D_CRT_SECURE_NO_WARNINGS)

您是否尝试使用“CRT\u SECURE\u NO\u WARNINGS”?可能是您在Visual Studio中的项目启用了“将警告视为错误”选项。阅读错误消息“将警告视为错误”设置为否(/WX-)是的,我可以使用strncpy,但为什么其他项目没有问题?请尝试使用/GS-标志“即您应该使用strncpy的安全版本”仅供参考,SDL检查所推荐的安全版本似乎不适合跨平台开发。看起来您必须对不仅仅针对windows的程序禁用此检查。为什么
\define\u CRT\u SECURE\u NO\u警告
需要在
\include?
@cal17\u hogo上面,这取决于
\include
d标题中的内容。如果标题不依赖于任何需要
\u CRT\u SECURE\u NO\u警告的内容
,那么
\define
可以在
\include
s之后,或者按照每个目标:
目标编译定义(myTarget PRIVATE\u CRT\u SECURE\u NO\u警告)
#include "pch.h"
#define _CRT_SECURE_NO_WARNINGS
....
add_definitions(-D_CRT_SECURE_NO_WARNINGS)