【vc++精品源码栏目提醒】:网学会员在vc++精品源码频道为大家收集整理了“【精品文档】VC6代码向VC2005升级时要注意的问题 - 其它管理文献“提供大家参考,希望对大家有所帮助!
VC6代码向VC2005升级时要注意的问题将以前的代码在vc2005下编译经常会遇到类似如下的警告: 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 那么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. 使用_countofx来取代sizeofx/sizeofelement. _countof将会正确的计算元素个数而且如果x是一个指针编译器将会发出一个警告来提醒程序员仅针对C编译 7. 记住所有的sizes大小非长度都是使用characters字符unicode下一个字符占2个byte作为单位而不是bytes字节. 8. 记住所有的sizes大小非长度缘由同上包含了字符串结束符0即别忘了很多情况下size需要1。
9. 调试的时候监视数据0xfd。
在调试版本下0xfd将会被填充在数据buffer通常是字符串的结尾处。
如果运行非你所愿可能会得到一个长度错误。
10. 检查所有的错误。
许多新函数相比旧函数能返回表示错误信息的数值。
今天在把以前的项目port到VC2005上来时碰到了不少问题大都和字符处理相关。
VC2005中默认的字符处理函数都是调用双字节版本而且直接在代码中输入的字符串都默认为双字节的。
在项目的转换Log中发现这一段The C/C compiler default settings have been modified to be more compliant with ISO Standard C. Included in those changes are enforcing Standard C for loop scoping and supporting wchar_t as a native type. These changes may cause existing code to no longer compile without changes to the code or the compiler options with which it is built. Standard C 有要求wchar_t作为默认的字符类型吗只好先在Project-Properties-Configuration Properties-C/C-Language中的选项Treate wchar_t as Build-in Type设置为No 还有一点就是VC2005的CRT用的是新版的Security-Enhanced Versions of CRT Functions有关字符串处理的相关函数都被建议用后缀加上_s的版本这样的话在从以前项目的转换中会出现一大堆的warnings做好的解决办法是在预编译头文件中的任何include之前加入: //for Secure Template Overloads of Security-Enhanced Versions of CRT Functions define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 定义这个宏就会默认使用Security-Enhanced CRT即使你的代码中用的并不是加后缀_s的函数版本因为它在库中使用了一个