东莞网站网络网站设计 网站推广 网站优化
news/
2025/9/28 21:35:10/
文章来源:
东莞网站网络,网站设计 网站推广 网站优化,余姚网络推广,做京东电脑端首页链接的网站C4996 编译警告非常常见#xff0c;经常发生在程序调用了类似于strcpy这样的不够安全的函数时。例如以下代码在 Visual C 的默认工程设置中会引起 C4996 编译警告#xff1a;
void foo()
{char filename[MAX_PATH];strcpy(filename, D:\\Pub\\Test\\1.dat);
}编…C4996 编译警告非常常见经常发生在程序调用了类似于strcpy这样的不够安全的函数时。例如以下代码在 Visual C 的默认工程设置中会引起 C4996 编译警告
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将代码修改为
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 警告
#if defined(_WIN32) defined(_MSC_VER)
#pragma warning(disable: 4996)
#endif在函数的后面新增以下 #pragma 指令恢复 4996 警告
#pragma warning(default: 4996)然后再编译可以看到4996 编译警告消失了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921148.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!