一、问题
在Visual Studio 2022中将源文件扩展名改为 .c 后,没有显示 #define _CRT_SECURE_NO_WARNINGS 1?
二、解答
对于使用了不安全的C运行时库函数(如strcpy、scanf等)而触发的安全警告,编译器不会默认包含_CRT_SECURE_NO_WARNINGS这个预处理器定义来静默这些警告。
_CRT_SECURE_NO_WARNINGS 是一个预处理器宏,用于禁用C运行时库中的某些不安全函数使用时产生的编译器警告。当您使用如 scanf、strcpy 等被视作潜在不安全的函数时,Visual Studio 编译器(特别是对于C++项目)会发出警告。
但在Visual Studio 2022中,将源文件扩展名从其他类型更改为.c后,发现没有自动添加 #define _CRT_SECURE_NO_WARNINGS 1 这一行代码,是因为VS并不会因为文件类型的更改而自动插入预处理器定义。
以下两种方法替代#define _CRT_SECURE_NO_WARNINGS 1 这一行代码,解决对于使用了不安全的C运行时库函数(如strcpy、scanf等)而触发的安全警告
解决办法一
可能是因为已经在项目级别上启用了此选项,或者已经自定义了项目级别的编译选项,从而禁用了这些安全检查。按照以下步骤进行操作:
1、如图所示,打开属性
2、配置属性-->C/C++-->常规--> SDL 检查将是(/sdl)更改为否(/sdl-)
3、在同一选项卡中,C/C++-->代码生成-->安全检查,将启用安全检查(/GS)改为禁用安全检查(/GS-)-->确定即可
解决办法二
1、右键点击解决方案资源管理器中的项目名称,选择“属性”
2、在弹出的“项目属性页”窗口中,导航至“配置属性”-->“C/C++”-->“预处理器”-->在“预处理器定义”列表中,添加或编辑现有定义,加入以下代码(要加 ; 再添加),确定即可
_CRT_SECURE_NO_WARNINGS/*_CRT_SECURE_NO_WARNINGS 是一个预处理器宏,用于禁用C运行时库中的某些不安全函数使用时产
生的编译器警告。当您使用如 scanf、strcpy 等被视作潜在不安全的函数时,Visual Studio 编译器
(特别是对于C++项目)会发出警告。
*///可直接将以下代码复制即可
//_UNICODE;UNICODE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS
这样设置后,无论源文件扩展名是 .c 还是 .cpp,整个项目内的所有源代码在编译时都不会因为使用了被认为是不安全的API而显示警告信息。
-
对创建过的项目还是出现报错,如图所示,修改创建过的文件的属性
三、总结
采取上述提到的两种全局设置方法,在项目的属性配置中为所有C/C++源文件添加此预处理器定义或者禁用安全检查,就可以解决相关问题