VS2005:declared deprecated warning问题

fopen独占方式操作文件 C API fopen打开的文件无法以独占方式操作文件,此代码利用Windows API巧妙的解决了该问题 立即下载

    在VS2005下编译代码,有时会遇到类似如下的警告: warning C4996: 'strcat' was declared deprecated. 通常这类警告都是由于调用了字符串相关函数引起的。虽然这警告无伤大雅,仅仅只是说使用的函数已过时(deprecated)<需要用新的函数来替代>,但看着实在别扭,且看看ms为什么要设置成这样。

    搜索了一下ms的网站,找到了结果。ms认为以前的c/c++库中有一部分函数不够安全,希望程序员可以使用他们的替代安全库(Safe Library)来避免不必要的隐患。 整个原文请点击以下链接访问:Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries

    在网上搜索到的最常用的解决方案,那就是定义 _CRT_SECURE_NO_DEPRECATE _SCL_SECURE_NO_DEPRECATE 来禁止vc2005对此产生警告(依然使用的是非安全库!显然并不是一个好的解决方案)。而且如果使用了ATL,则还需要定义 _ATL_SECURE_NO_DEPRECATE 使用了MFC则需要定义 _AFX_SECURE_NO_DEPRECATE
    
然而尽管如此,更好的解决方案只需要定义一个宏CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES, 那么VS将会自动替换使用他们的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.
检查所有的错误。 许多新函数相比旧函数,能返回(表示)错误信息(的数值)

 

————————————————————————————————————————————————

     PS:定义宏_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES好像不能消除警告

 

 

1. gets_s()代替gets()
2.strcpy_s()来代替strcpy()
3.strncpy_s()代替strncpy()
4.sprintf_s()代替sprintf()
5.CString::Format(_T("字符转"))代替CString::Format("字符转")
6.strcat_s()代替strcat()
7.fopen_s()代替fopen()
8._vsnprintf_s()代替_vsnprintf()
9._ftime64_s()代替_ftime64()
10._get_tzname ()代替_tzname()
11._snwprintf_s()代替_snwprintf()
12.mbstowcs_s()代替mbstowcs()
13.wcstombs_s()代替wcstombs()
14.wcscat_s()代替wcscat()
15._wcsupr_s()代替_wcsupr()
16._wcslwr_s()代替_wcslwr() 

17._wtoi()代替atoi()

在C++遇到有些关键字或者函数被弃用的情况,比如xxx was declared deprecated 在C++遇到有些关键字或者函数被弃用的情况 随着每一次C++的不断更新,可能都会有些函数或者关键字会被弃用,或者换成了其他的名字,这在编写代码的时候经常会碰到,碰到这种情况,可以在代码的第一行写上忽略此错误的句子,一般为: #pragma  warning(disable:错误编号) 如:下面这段代码中使用了strdup(),此函数的功能是讲函数中的数据拷贝到另一个变量中,这是调试程序会 阅读详情

相关推荐

vc2005 : declared deprecated warning

转载:http://spraut.spaces.live.com/vc2005 : declared deprecated warning    将以前的代码在vc2005下编译,经常会遇到类似如下的警告: warning C4996: strcat was declared deprecated. 通常这类警告都是由于调用了字符串相关函数引起的。虽然这警告无伤大雅,仅仅只是说使用的函

sophia_sy的专栏 1258

‘GetVersionExA‘: was declared deprecated

函数在编译时被标记为不推荐使用(deprecated)。这通常意味着该函数虽然仍然可以使用,但是在未来的Windows版本中可能会被一个更新的或者更好的函数所取代。项目(P) — 属性(P) — 属性页 — 配置属性 — C/C++ — 常规 — SDL检查:把"是 (/sdl)"改为"否 (/sdl-)"

东方猫的博客 294

VS2005编译之declared deprecated警告

<br /><br />在VS2005下编译代码,有时会遇到类似如下的警告: warning C4996: 'strcat' was declared deprecated. 通常这类警告都是由于调用了字符串相关函数引起的。虽然这警告无伤大雅,仅仅只是说使用的函数已过时(deprecated)<需要用新的函数来替代>,但看着实在别扭,且看看ms为什么要设置成这样。<br /> <br />    搜索了一下ms的网站,找到了结果。ms认为以前的c/c++库中有一部分函数不够安全,希望程序员可以使用他们的替代

tidavery的专栏 1945

vc++ express edition中禁止XXX was declared deprecated提示信息

 我使用的是VC++2005和VC++2008 Express Edition,MS提供了一套安全字符串处理函数和I/O函数,例如使用scanf时会遇到以下warning:warningC4996: scanf was declared deprecated取消这条提示的方法很简单。但对它的提示很有兴趣,先看看sc

jcwKyl的专栏 3958

VS2005:declared deprecated warning问题——strcpy_s和strcpy区别

    在VS2005下编译代码,有时会遇到类似如下的警告: warning C4996: strcat was declared deprecated. 通常这类警告都是由于调用了字符串相关函数引起的。虽然这警告无伤大雅,仅仅只是说使用的函数已过时(deprecated)需要用新的函数来替代>,但看着实在别扭,且看看ms为什么要设置成这样。    搜索了一下ms的

DaLei的专栏 3696

VS2005 出现warning C4996: strcpy was declared deprecated

      在使用VC 2005 的开发者会遇到这样的问题,在使用std命名空间库函数的时候,往往会出现类似于下面的警告:    warning C4996: strcpy was declared deprecated        出现这样的警告,是因为VC2005中认为CRT中的一组函数如果使用不当,可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如:strcpy、str

码农的菜园子 3353

VS2005 出现警告warning C4996: strcpy was declared deprecated 的解决办法

VS2005 出现警告warning C4996: strcpy was declared deprecated 的解决办法

Programmer And Coder 2888

关于VS2003中的Warning:strcpy was declared deprecated.

 VC2005/2003中认为CRT中的一组函数如果使用不当,可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如:strcpy、strcat等。    对于这些问题,VC2005建议使用这些函数的更高级的安全版本,即在这些函数名后面加了一个_s的函数。这些安全版本函数使用起来更有效,也便于识别,如:strcpy_s,calloc_s等。在网上搜索到的最常用的解决方案,那就是定义

liulian1111的专栏 577

VS2005编译VC6的工程,warning C4996: strcpy was declared deprecated

<br />在使用VC 2005 的开发者会遇到这样的问题,在使用std命名空间库函数的时候,往往会出现类似于下面的警告:    warning C4996: strcpy was declared deprecated <br /><br />出现这样的警告,是因为VC2005中认为CRT中的一组函数如果使用不当,可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如:strcpy、strcat等。<br /><br />对于这些问题,VC2005建议使用这些函数的更高级的安全版本,即在这些函

周江涛的专栏 1519

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

转载自http://hi.baidu.com/jetqu2003/blog/item/a42d8dcb8fdead19bf09e6e3.html 一、找到一个方法: VC6---选项Project | Configuration Properties | C/C++ | Preprocessor | Preprocessor Definitions 添加_CRT_SECURE_NO_DE

tech_ant的专栏 858

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: '_snprintf' was declared deprecated 警告信息的消除方法

使用VS2005编译如下语句: _snprintf(gs_LastErr, sizeof(gs_LastErr) - 1, "%s: NULL device %s\n", sFunc, !pDev ? "handle" : "context"); vsnprintf(gs_LastErr, sizeof(gs_LastErr) - 1, sFormat, argp); 提示如下警告信

wwfish的专栏 1819

warning,C4996,sprintf,deprecated,C4996,strcpy,C4996,strcat

vs2003,vs2005中用sprintf会出现warningC4996:'sprintf'wasdeclareddeprecatedwarningC4996:'strcpy'wasdeclareddeprecatedwarningC4996:'strcat'wasdeclareddeprecated的警告。这里给出解决问题的一些方法。方法一:调用VS20...

weixin_30390075的博客 139

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

vs开发笔记:C4996

关闭VS警告 warning C4996 warning C4996: '_vsnprintf': This function or variable may be unsafe....... warning C4996: strcpy was declared deprecated 出现这样的警告,是因为VC2005之后的版本中认为CRT中的一组函数如果使用不当,可能会产生诸如记忆...

xinghaikongmeng的博客 284
上一篇: Tomcat配置SQL Server连接池配置方法
下一篇: VS2005 C++ 项目怎样添加“依赖”、“库目录”和“包含目录”
zeuskaaba
博客等级 码龄20年 30粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值