VC6 和 VS2003 转换到VS2005 时可能会遇到的问题以及解决方法_第1页
VC6 和 VS2003 转换到VS2005 时可能会遇到的问题以及解决方法_第2页
VC6 和 VS2003 转换到VS2005 时可能会遇到的问题以及解决方法_第3页
VC6 和 VS2003 转换到VS2005 时可能会遇到的问题以及解决方法_第4页
VC6 和 VS2003 转换到VS2005 时可能会遇到的问题以及解决方法_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC6 和和 VS2003 转换到转换到 VS2005 时可能会遇到的问题以及解决方法时可能会遇到的问题以及解决方法 今天在将 2003 建立的工程转换成 2005 时 发现遇到很多问题 网上搜了一些解决办法 经常写经常写 VC 工程的人都会遇到升级到工程的人都会遇到升级到 VS2005 时出现的各种各样的问题 下面写一时出现的各种各样的问题 下面写一 些自己遇到的问题 还有什么不全的请大家补充 希望能给朋友们一些帮助 些自己遇到的问题 还有什么不全的请大家补充 希望能给朋友们一些帮助 VC6 和和 VS2003 转换到转换到 VS2005 时可能会遇到的问题以及解决方法时可能会遇到的问题以及解决方法 1 以前可以这样用以前可以这样用 try catch catch CException e pApp Warn s e GetErrorMessage e Delete return FALSE 现在必须修改为 现在必须修改为 catch CException e TCHAR errormsg 255 e GetErrorMessage errormsg 255 NULL pApp Warn s errormsg e Delete return FALSE 2 strchr 必须强制转换一下 必须强制转换一下 以前可以以前可以 char str2 strchr line 2005 必须必须 char str2 char strchr line 3 lifescope of int i in for int i i size i in VC6 the codes below are ok for int i 0 i 10 i for i 20 i 40 i but in VS2005 we should write like below for int i 0 i 10 i for int i 20 iC C Language treat Wchar t 改为改为 No 未完待续未完待续 官方总结官方总结 Visual C 2005 库已经发生了一系列的变化 可能会对现有的程序有所影响库已经发生了一系列的变化 可能会对现有的程序有所影响 在升级到 在升级到 Visual C 2005 之前 必须要确定程序中没有这些问题 之前 必须要确定程序中没有这些问题 1 参数的有效性 参数的有效性 在在 C 运行时库中 加入了一些代码 以检查参数的有效性 例如 如果传递的目运行时库中 加入了一些代码 以检查参数的有效性 例如 如果传递的目 标缓冲区大小不足以标缓冲区大小不足以 strcpy 使用使用 通常这是在冒安全风险 而新版本此时则会调用一个通常这是在冒安全风险 而新版本此时则会调用一个 非法参数处理程序 在非法参数处理程序 在 release 版中 会调用版中 会调用 Dr Watson 而在 而在 debug 版中 会产版中 会产 生断言 生断言 assert 当然 只要程序中传递的参数都是有效的 就不会有什么问题了 当然 只要程序中传递的参数都是有效的 就不会有什么问题了 2 对非安全 对非安全 API 的警告的警告 在在 Visual C 2005 中 中 CRT 中的一组函数已不再建议使用 而应使用新中的一组函数已不再建议使用 而应使用新 提供的安全版本 大多数这些不建议使用的函数如果使用不当 将会导致缓冲区溢出或其提供的安全版本 大多数这些不建议使用的函数如果使用不当 将会导致缓冲区溢出或其 他安全问题 这些函数如 他安全问题 这些函数如 strcpy strcat 等等 这些函数新的安全版本都在函数名后等等 这些函数新的安全版本都在函数名后 加了一个加了一个 s 后缀 以方便识别 如后缀 以方便识别 如 strcpy s wcscpy s mbscpy s calloc s 和和 strcat s 这些函数 这些函数 如果想继续使用老版本 非安全的函数 可在源代码开始处加上如果想继续使用老版本 非安全的函数 可在源代码开始处加上 define valu e of CRT SECURE NO DEPRECATE 此处 此处 value 代表某一数值 然而 还代表某一数值 然而 还 是建议大家升级代码使用新的安全函数 是建议大家升级代码使用新的安全函数 3 迭代器越界 迭代器越界 受检查的迭代器 受检查的迭代器 checked iterators 和调试迭代器 和调试迭代器 debug iterators 也因为安全的原因进行了相应的更新 如果迭代器越界 则相应会调用一个非法参数处 也因为安全的原因进行了相应的更新 如果迭代器越界 则相应会调用一个非法参数处 理程序 理程序 再次提醒 可以通过抛出一个越界异常来避免产生非法参数问题 在代码中加入再次提醒 可以通过抛出一个越界异常来避免产生非法参数问题 在代码中加入 define value of SECURE SCL THROWS 并把 并把 value 值设为值设为 1 这样就不会这样就不会 调用非法参数处理程序 而是产生一个异常了 调用非法参数处理程序 而是产生一个异常了 也可以通过设置也可以通过设置 defined value of SECURE SCL 值为零 关闭此迭代值为零 关闭此迭代 器检查 通常默认情况下 此选项是打开的 器检查 通常默认情况下 此选项是打开的 4 time t 类型类型 time t 类型通常用于显示从类型通常用于显示从 1970 年开始以来的秒数 直到年开始以来的秒数 直到 Visual C 7 1 即 即 Visual C net 2003 time t 类型都被定义为一个类型都被定义为一个 long 而到了 而到了 Visu al C 2005 中 已被定义为一个中 已被定义为一个 64 位类型 可用于显示一直到位类型 可用于显示一直到 3000 年的时间了 年的时间了 5 链接到 链接到 CRT 托管应用程序现在不能静态链接到托管应用程序现在不能静态链接到 CRT 以往 在 以往 在 Visual C 7 0 和和 7 1 中 指中 指 Visual Studio NET 2002 与与 2003 可以生成静态链接到 可以生成静态链接到 CRT 的的 CLR 程程 序 而在序 而在 Visual Studio 2005 却行不通 却行不通 6 单线程 单线程 CRT 支持支持 在在 Visual Studio 2005 中 已经取消了单线程中 已经取消了单线程 CRT 支持 而且用发展的眼支持 而且用发展的眼 光来看 未来大多数的人还是愿意使用线程安全的多线程代码 光来看 未来大多数的人还是愿意使用线程安全的多线程代码 在线程中 可使用在线程中 可使用 nolock 后缀来优化代码 但同时 这些函数是非线程安全的 后缀来优化代码 但同时 这些函数是非线程安全的 7 异常处理 异常处理 有两种类型的异常处理可供选择 有两种类型的异常处理可供选择 EHa 异步的 和 异步的 和 EHs 同步 同步 C 异常异常 在以前 如果使用了 在以前 如果使用了 EHs 那么在一个 那么在一个 catch 块中 也许可能 也许不可能捕块中 也许可能 也许不可能捕 捉到结构化异常 因为此行为是没有定义且不可靠的 现在 再使用捉到结构化异常 因为此行为是没有定义且不可靠的 现在 再使用 EHs 时 就可保证时 就可保证 不会捕捉到结构化异常 如果想与以前版本的不会捕捉到结构化异常 如果想与以前版本的 Visual C 保持一致 并且捕捉异步结构保持一致 并且捕捉异步结构 化异常 还是应该在编译时使用化异常 还是应该在编译时使用 EHa 8 初始化顺序 初始化顺序 以往 如果代码中同时有托管与本地全局变量及对象 那么初始化顺序是不确定以往 如果代码中同时有托管与本地全局变量及对象 那么初始化顺序是不确定 的 如代码中存在托管对象与本地对象互操作 就不能保证哪一个对象先初始化了 现在的 如代码中存在托管对象与本地对象互操作 就不能保证哪一个对象先初始化了 现在 Visual Stuio 2005 可保证所有的本地全局变量及对象先初始化 然后才初始化托管可保证所有的本地全局变量及对象先初始化 然后才初始化托管 全局变量及对象 全局变量及对象 9 printf 就目前来说 就目前来说 printf 中的中的 n 格式化指示符一般用于指定输出的字符个数 这格式化指示符一般用于指定输出的字符个数 这 已经确认为一个安全隐患 并且已禁用 但可以使用已经确认为一个安全隐患 并且已禁用 但可以使用 set printf count output 来启来启 用它 通过传递给用它 通过传递给 set printf count output 一个零值 一个零值 0 可禁用它 而传递任意 可禁用它 而传递任意 一个其他值可再次启用 一个其他值可再次启用 10 swprintf 函数函数 为与为与 C 标准保持一致 对标准保持一致 对 swprintf 函数也作了修改 现在它已遵循函数也作了修改 现在它已遵循 C 标准了 在标准了 在 C 中 通过适当的参数 可实现重载 这个函数的老版本已不再建议使用中 通过适当的参数 可实现重载 这个函数的老版本已不再建议使用 因为在 因为在 C 中 是不允许重载的 因此如果使用老格式 将会返回一个错误 编译器中的中 是不允许重载的 因此如果使用老格式 将会返回一个错误 编译器中的 突破性变化突破性变化 除了那些会影响到库的变化之外 也有一些变化会影响到编译器 以下是除了那些会影响到库的变化之外 也有一些变化会影响到编译器 以下是 Visu al C 2005 中编译器的主要变化 需再次提醒的是 此处并没有列出所有的变化 但中编译器的主要变化 需再次提醒的是 此处并没有列出所有的变化 但 却是微软公司却是微软公司 VC 使用者及内部合作者所确认的关键性变化 使用者及内部合作者所确认的关键性变化 指向成员的指针指向成员的指针 在之前的版本中 一个指向成员的指针不需使用取址操作符 在之前的版本中 一个指向成员的指针不需使用取址操作符 i 10 i codes here if i 10 error in Vc8 for i 0 i 5 i error in Vc8 解决方法 在 for 语句之前声明变量 可保证代码在 vc7 1 和 vc8 下同时编译通过 int i 0 for i 0 i 10 i for i 0 i 5 i 2 指针和引用的声明 在 Vc7 1 中 下面的代码可以编译 但是 vc8 会报 C4430 错误 很难想象有些美国程 序员竟然这样声明 const error in VC8 const int b error in VC8 int myfun const error in VC8 解决方法 把 或 const int b int myfun const B 3 默认 int 类型 在 vc7 1 中 如果定义一个变量但不声明类型 那么默认为 int VC8 不支持 static i 0 C4430 error in Vc8 const i 0 C4430 error 解决方法 加上 int static int i 0 const int i 0 4 函数的默认返回值类型 同上 VC8 不支持把 int 作为默认返回值类 Func return 0 error in VC8 解决方法 明确声明函数返回值类型为 int int Func return 0 5 函数地址 Vc7 中函数名就是地址 在 vc8 中 必须要使用 void fun int A test void int main fun A Test C3867 error in VC return 0 解决方法 加上 6 隐式类型转换 VC8 不允许 B 到 const B void fun const B if possible use const B instead int main B test new B fun test error in VC8 return 0 解决方法 强制转换或函数参数变成 const B void fun const B 7 友元方法 Friend function VC8 不允许声明一个 private 或 protected 函数为友元 class A private void c class B friend void A c C2248 error c is invisible to class B 解决方法 1 声明友元类 class A private void c class B friend class A 解决方法 2 把函数声明为 public class A public void c class B friend void A c 8 STL 的 stdext 命名空间 在 vc8 中 hash map 和 hash set 被移进了 stdext 命名空间中 include std hash map error in VC8 解决方法 使用 stdext 命名空间 include stdext hash map 9 头文件 许多头文件如 fstream h 和 iostream h 在 VC8 中已经不存在了 include error in VC8 解决方法 使用 STL include 10 Iterator 一些 STL 类 iterators 不再用指针实现 std vector m data std vector iterator iter 解决方法 std vector iterat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论