warning C4996: 'sprintf' was declared deprecated see declaration of 'sprintf'

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

转载自http://hi.baidu.com/jetqu2003/blog/item/a42d8dcb8fdead19bf09e6e3.html

一、找到一个方法:

VC6---选项Project | Configuration Properties | C/C++ | Preprocessor | Preprocessor Definitions
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE

VS2005 项目属性---C/++ --->预处理定义下-》配置 -》下面添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE两个宏

二、

在vs2003, vs2005中 用sprintf 会出现   warning C4996: 'sprintf' was declared deprecated see declaration of 'sprintf' 的警告 消除方法

1: 文件最开始: #define _CRT_SECURE_NO_DEPRECATE 或者干粹在工程属性中设置如一中所说。

2: 不屏蔽的话就只能调用VS鼓吹的那些带“_s”后缀的非标准函数。例如sprintf_s在函数后面加_s

3: 用StringCchPrintf

三、关键词 Security    Enhancements    in    the    CRT                                          

将过去的工程用VS2005打开的时候。你有可能会遇到一大堆的警告:warning C4996。
比如:warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

原因是Visual C++ 2005使用了更加安全的run-time library routines。
新的Security CRT functions(就是那些带有“_s”后缀的函数):
http://msdn2.microsoft.com/en-us/library/wd3wzwts(VS.80).aspx

那么如何搞定这些警告呢:
方法一:手工将原来的旧函数替换成新的Security CRT functions。
方法二:屏蔽这个警告。
            在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:
            #define _CRT_SECURE_NO_DEPRECATE
            或者#param warning(disable:4996)

方法二没有使用新的更安全的CRT函数,显然不是一个值得推荐的方法,可是你又不想一个一个地改。
那么还有一个更方便的方法:

在预编译头文件stdafx.h里(同样要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
链接的时候便会自动将旧函数替换成
Security CRT functions。
注意:这个方法虽然使用了新的函数,但是不能消除警告(原因见红字),你还得同时使用方法二。。。

在网上搜索到的最常用的解决方案,那就是定义 _CRT_SECURE_NO_DEPRECATE _SCL_SECURE_NO_DEPRECATE 来禁止vc2005对此产生警告(依然使用的是非安全库!0显然并不是一个好的解决方案)。而且如果使用了ATL,则还需要定义 _ATL_SECURE_NO_DEPRECATE使用了MFC则需要定义 _AFX_SECURE_NO_DEPRECATE
   
然而尽管如此,更好的解决方案只需要定义一个宏 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES, 那么vc将会自动替换使用他们的Safe Library来代替C/C++标准库(strcat将被strcat_f来取代)

    即使使用了_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,代码将依旧不够安全:(, 对此,ms提出了如下10点建议:
    1.
不要认为 strcpy_s strncpy_s( 以及其他的字符串函数)(在空间不够的时候)会自动终止拷贝(truncate截断,不截断则意味着溢出).如果需要自动截断,请使用strncpy_s (同时使用_TRUNCATE作为长度参数)
    2.
记住fopen_s缺省是独占模式。如需共享使用文件,应该使用_sopen
    3.
别忘了_dupenv_s, 它将比_getenv_s更容易使用,因为它能自动分配一个正确长度的内存(buffer)
    4.
scanf_s中小心参数顺序。
    5.
确定printf_s中格式字符串的正确。
    6.
使用_countof(x)来取代sizeof(x)/sizeof(element). _countof将会正确的计算元素个数,而且如果x是一个指针,编译器将会发出一个警告(来提醒程序员,仅针对C++编译)
    7.
记住所有的sizes(大小,非长度)都是使用characters(字符,unicode下一个字符占2byte)作为单位,而不是bytes(字节).
    8.
记住所有的sizes(大小,非长度,缘由同上)包含了字符串结束符'\0'(即别忘了很多情况下size需要+1)
    9.
调试的时候监视数据0xfd (在调试版本下)0xfd将会被填充在数据(buffer,通常是字符串)的结尾处。如果运行非你所愿,可能会得到一个长度错误。
    10.
检查所有的错误。许多新函数相比旧函数,能返回(表示)错误信息(的数值)

 

C++报错 sprintf': This function or variable may be unsafe. Consider using sprintf_s 在VS 2019中编译 C++ 语言项目,如果使用了 sprintf函数,编译时便会提示如下错误: error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNIN... 阅读详情

相关推荐

Xcode 14.0编译iOS项目出错 ‘sprintf‘ is deprecated

Xcode 14.0编译iOS项目出错 'sprintf' is deprecated

qq_37857689的博客 2962

去掉VC++2005、2008的安全警告提示

将过去的工程用VS2005打开的时候。你有可能会遇到一大堆的警告:warning C4996。比如:warning C4996: sprintf: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNIN

尹成的技术博客 1万+

【解决】屏蔽 Visual Studio 在 C++ 项目中的 C4996 错误

屏蔽 Visual Studio 在 C++ 项目中的 C4996 错误

Ervoconite 的博客 4456

严重性代码说明项目文件行 禁止显示状态错误C4996 ‘scanf‘: This function or variable may be unsafe.最全解决方法

方法八:在 项目属性 – c/c++ – 命令行 添加:/D _CRT_SECURE_NO_WARNINGS。方法五:无需在程序最前面加那行代码,只需在新建项目时取消勾选“SDL检查”即可;方法四:把scanf、scanf改为scanf_s、fopen_s;方法六:若项目已建立好,在项目属性里关闭SDL也行;方法一:在程序最前面加。方法三:在程序最前面加。

m0_54854467的博客 8151

warning C4996: 'sprintf' was declared deprecated see declaration of 'sprintf' 的警告消除方法

在vs2003, vs2005中   用sprintf   会出现   warning   C4996:   sprintf   was   declared   deprecated see   declaration   of   sprintf  的警告 消除方法1: 文件最开始: #define   _CRT_SECURE_NO_DEPRECATE  或者干粹在工程属性中设置。

熊晓杰 -- (暴熊 || kongbu0621 || kongbu0622) 的专栏 4473

warning C4996: 'sprintf' was declared deprecated see declaration of 'sprintf'

来源:http://blog.sina.com.cn/s/blog_7050644f0100wwuh.html#bsh-73-155616425   将过去的工程用VS2005打开的时候。你有可能会遇到一大堆的警告:warning C4996。 比如:warning C4996: 'sprintf': This function or variable may be unsafe. Cons

Yan_Programer 的专栏 702

warning: ‘sprintf‘ is deprecated: Use asprintf(), arg() or QTextSt

因为用的是Qt 6.0之后的版本,课本上是5.9,sprintf已经被弃用了,6.0之后用的是asprintf,把sprintf改成asprintf就行了。///保留后两位小数的意思。///保留后两位小数的意思。

weixin_68630274的博客 1050

Visual Studio 2005 移植 (札记之一)

Visual Studio 2005 移植 - WINVER,warning C4996, error LINK1104一、WINVER  Compile result:  WINVER not defined. Defaulting to 0x0502 (Windows Server 2003)  windows   server   2003    winver>=0x0502        

暧暧远人村,依依墟里烟 ... 5805

C++ 开源项目导入后 无法生成 编译报错

错误信息如下: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 翻译后: “sprintf”:此函数或变量可能不安全。请考虑使用sprintf_s来代替。要禁用废弃文件,请使用_CRT_SECURE_NO_WARN

往南的博客 861

visual studio错误之‘fopen‘: This function or variable may be unsafe

出现以上错误时键工程名->属性->C/C+±>预处理器->预处理器定义->编辑。

qq_44698083的博客 1032

VS报错 --- 错误:c4996

错误:c4996

bigger_belief的博客 3067

屏蔽warning C4996

有的时候在自己的程序中,使用了第三方的库,而在这个库中大量使用了非安全版本的CRT函数。

朱铭雷的日记本 1万+

编译时出现error C4996 解决方法

1:使用安全的函数替换老的函数 2:屏蔽警告信息 1.#param warning(disable:4996) 2.在预编译头文件stdafx.h里定义下面的宏(include其他头文件的最前面):   #define _CRT_SECURE_NO_DEPRECATE或#define _CRT_SECURE_NO_WARNINGS 3.更改预处理定义:   项目->属性->配置属性-

云淡风轻 4万+

c++编译时打开warning-as-error,并在特定情况下关闭某些warning检查

为提升c++代码质量,将所有warning当作error处理,可有效提升代码质量。在cmake中开启的方式如下: 其中,打开大部分warning,打开一些特定需求。前者不包含后者。关闭warning有相应语法如下: gcc关闭“有无符号数据对比”检查的warning (即sign-compare) clang关闭“有无符号数据对比”检查的warning (即sign-compare) 使用宏关闭特定warning (gcc / clang) 定义关闭warning的宏(gcc / clang) 使用关闭w

LaineGates的专栏 7805

记录Mac编译Android源码踩过的坑

学习Android源码,如果电脑配置还不错,最好还是下载一套源码,经过编译后导入到Android Studio中来学习,这样会更加的直观,代码之间的跳转查看会更加方便。因此,笔者决定下载并编译一套源码,以利于源码的探索和学习。本文不介绍怎么下载的源码,主要是记录编译源码时踩过的坑,为自己同时也便于读者少走弯路。

neuHenry 2071

VC 忽略警告的方法

在vs2003, vs2005中用sprintf 会出现warning C4996: 'sprintf' was declared deprecatedwarning C4996: 'strcpy' was declared deprecatedwarning C4996: 'strcat' was declared deprecated的警告。 这里给出解决问题的一些方法。

于大大大洋 5764

vs2022 版本 scanf printf sprintf 等报错

因为上面的函数不会对放数据的空间进行检测,可能导致输入的数据空间大于原有的数据空间,出现越界访问,在vs2022以错误显示。将上述函数改为 scanf_s ,printf_s ,sprintf_s即可。错误原因:使用上述函数存在安全问题。改正办法:报错出提示有方法。

Love_weijinhui的博客 1452

VisualStudio2022 关于C4996和C6031错误的解决方法

微软不建议再使用C的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误。

Deccc.的博客 4336
上一篇: 转网上关于VC维的一些解释,通过这些解释可以比较清楚地了解VC维
下一篇: warning C4819: The file contains a character that cannot be represented in the current code page
tech_ant
博客等级 码龄14年 5粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值