C Tips: 举例说明在 Visual C++ 中忽略 C4996 编译警告的几种方法

C4996 编译警告非常常见,经常发生在程序调用了类似于strcpy这样的不够安全的函数时。例如以下代码在 Visual C++ 的默认工程设置中会引起 C4996 编译警告:

c 复制代码
void foo()
{
    char filename[MAX_PATH];
    strcpy(filename, "D:\\Pub\\Test\\1.dat");
}

编译警告如下图所示:

报错信息:

复制代码
C4996	'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

这里它显示为一个 Error,并且阻止编译通过。当然我们可以用安全的函数strcpy_s来替换不安全的函数strcpy,将代码修改为:

c 复制代码
void foo()
{
    char filename[MAX_PATH];
    strcpy_s(filename, MAX_PATH - 1, "D:\\Pub\\Test\\1.dat");
}

这样就完全不会有任何编译警告或错误。

但是如果我们就是不想改我们的代码呢?因为确实在这里strcpy也并没有实际的风险。或者有时候我们在维护或者引用一段旧代码,我们就是想尽量维持这段代码的原貌。出于这些原因,我们想要忽略这里的 C4996 编译警告。

那么这里给出以下方法:

一、关闭安全检查 SDL

如下图所示:

我们的 MSVC 工程启用了 SDL 安全检查,因此这个选项阻止我们编译通过带着 C4996 这样的问题的代码。可以将 SDL Checks 这个选项从Yes (/sdl)改成No (/sdl-),然后再编译,结果如下:

可以看到,它依然报告 C4996 编译警告,但是允许编译通过了。

SDL 安全检查自然是有它的用处,关闭这个安全检查未必是好的选择,您自己斟酌。

二、在 Preprocessor 中增加 _CRT_SECURE_NO_WARNINGS 宏定义

第二种解决方法就在报错信息里面。在项目属性页 C/C++ | Preprocessor | Preprocessor Definitions 中增加宏定义:_CRT_SECURE_NO_WARNINGS

然后再编译,就会看到 C4996 编译警告/错误 消失了。

对于_CRT_SECURE_NO_WARNINGS这个宏定义,微软官方网站上在在这篇文章里进行了解释:Security Features in the CRT

三、禁止特定的编译警告

在项目属性页 C/C++ | Advanced | Disable Specific Warnings 中,填写要禁止的编译警告的代号:4996

然后再编译,就会看到 C4996 编译警告/错误 消失了。

关于 在这篇文章里提到:https://learn.microsoft.com/en-us/cpp/build/reference/compiler-option-warning-level

四、通过 #pragma 指令禁止 C4996 警告

如果我并不想对整个项目产生影响,仅仅想只是禁止在这个函数的编译中禁止 C4996 警告,那要怎么做呢?

方法是:在函数的前面,新增以下 #pragma 指令,禁止 4996 警告:

c 复制代码
#if defined(_WIN32) && defined(_MSC_VER)
#pragma warning(disable: 4996)
#endif

在函数的后面,新增以下 #pragma 指令,恢复 4996 警告:

c 复制代码
#pragma warning(default: 4996)

然后再编译,可以看到,4996 编译警告消失了。

相关推荐
范纹杉想快点毕业25 分钟前
以项目的方式学QT开发(三)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·开发语言·c++·qt·mysql·算法·命令模式
敲代码的瓦龙43 分钟前
STL?list!!!
c语言·开发语言·数据结构·c++·windows·list
程序员莫小特1 小时前
【GESP真题解析】第 20 集 GESP 二级 2025 年 3 月编程题 1:等差矩阵
c语言·数据结构·c++·算法·青少年编程·矩阵
机器视觉知识推荐、就业指导1 小时前
Qt/C++面试【速通笔记九】—视图框架机制
c++·笔记·qt
君鼎7 小时前
C++设计模式——单例模式
c++·单例模式·设计模式
刚入门的大一新生8 小时前
C++初阶-string类的模拟实现与改进
开发语言·c++
小冯的编程学习之路8 小时前
【软件测试】:推荐一些接口与自动化测试学习练习网站(API测试与自动化学习全攻略)
c++·selenium·测试工具·jmeter·自动化·测试用例·postman
C++ 老炮儿的技术栈10 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
猪八戒1.010 小时前
C++ 回调函数和Lambda表达式
c++
源远流长jerry10 小时前
匿名函数lambda、STL与正则表达式
c++