当前位置:首页 >> 农林牧渔 >>

再谈从vc6迁移到vs2005


再谈从 vc6 迁移到 vs2005
Posted on 2006-03-13 11:03 小明 阅读(3880) 评论(9) 属分类: C/C++ 编辑 收藏 引用 所

http://www.cppblog.com/sandy/arch ive/2006/03/13/4081.html
作为 C++编译器,从 vc6 到 vc8 最大的调整就是对 C++标准的支持更好了。 我发现的几点不同。 a. For 循环的声明
Vc6: for(int i<0;i<100;++i){}; j = i; Vc8: for(int i<0;i<100;++i){}; j = i; (ok) (illegal) (ok)

int i; for(i<0;i<100;++i){}; j = i;

Vc8 中的 for 循环中变量的有效期仅仅在 for 循环的开始与结束期间有效。 b.string 实现

Vc6: string s; char *p = s.begin(); (ok) Vc8: string s; char *p = s.begin(); (illegal) string s; char *p = const_cast<char *>(s.c_str()); (ok)

在 vc6 中,string::iterator 被定义为 char *,但是 vc8 中不是 c.更严格的 typename 声明的需要
Vc6: template<class T> class Test { public:

typedef map<T,T> mymap; mymap::iterator mymap_iter; }; (ok) Vc8: template<class T> class Test { public: typedef map<T,T> mymap; mymap::iterator mymap_iter; }; (illegal)

typename mymap::iterator mymap_iter;(ok)

vc8 更加严格的要求程序员在类型前面加上 typename 以避免歧义 d.不允许默认的 int 类型
Vc6: fun() { return 0;} (ok) Vc8: fun() { return 0;} (illegal) int fun() { return 0;} (ok)

vc8 不支持默认返回 int 类型 e.typedef 必须是 public 才能被外界访问到
Vc6: Class Test { typedef int iterator; };

Test::iterator i; (ok) Vc8: Class Test { typedef int iterator; }; Test::iterator i; (illegal)

Class Test { public: typedef int iterator; }; Test::iterator i; (ok)

附录:一些资源(From msdn) Overviews:
? ? ?

What's new in 8.0 What's new in 7.1 What's new in 7.0

Moving from 6.0 to 7.1:
? ? ? ? ? ?

ATL/MFC Breaking changes (6.0 to 7.0) (also seen here but the list isn't as long) ATL/MFC Breaking changes (7.0 to 7.1) Standard c++ Library changes and issues specific to upgrading Compiler breaking changes In-depth info on increased standards compliance Project upgrading

Moving from 7.1 to 8.0:
? ? ? ? ? ? ?

Libraries breaking changes ATL obsolete topics and deprecated functions with replacements MFC obsolete topics Compiler breaking changes Deprecated compiler options Some removed linker options (mentioned here and here) Preprocessor changes

Feedback

# re: 再谈从 vc6 迁移到 vs2005 论
2006-03-13 14:06 by cf about b 这个应该是库实现的不同,而非编译器的吧,呵呵

回复 更多评

c++标准规定 template class basic_string 的 iterator 是 typedef implementation defined iterator; 这样的,即使 vc6 附带的 pj 库有 typedef char* iterator; 这样的定义,也不能认为二者有必要联系吧,换句话说,即便在 vc6(with 那个 pj 库)中 char *p = s.begin(); 能被编译通过,这么些也是不妥当的,呵呵

# re: cf

回复

更多评论

2006-03-13 15:12 by 小明 about b 这个确实跟编译器没有关系 但是由于 stl 的重要性,所以我也把这点列了上去。vc6 的 stl 实现跟 vc8 差异 还是很大的。因为我在看见的工程里面发现了很多 char *p = s.begin(); 这样 的写法,所以我不得不去改他们。

# re: 再谈从 vc6 迁移到 vs2005 论

回复 更多评

2006-03-13 17:11 by 沐枫网志 const_cast<char *>(s.c_str()) 这样的用法,也很不妥当哟。--估计这就是当初工程师之所以使用 begin()的 原因。 建议,如果是为了遍历字串,使用 string::iterator p = s.begin(); 或者 s[n],等方式来使用字符串。 这样,照样可以 *p++,也照样可以 *p = 'A',可以 s[10]='A',可以 char a = s[10]。 但是 s.c_str()就比较玄了……

# re: 沐枫网志

回复

更多评论

2006-03-13 17:34 by 小明 他们这样用,并不是为了遍历,很少有人需要遍历字符串,毕竟 string 有很多 成员函数可以帮助做到。 把 string 转为 char *,就为了传入一些 Windows API 中去。 用 c_str()没有问题,stl 标准规定的,保持 string 和 char *的可兼容。 经常是这样用的 string str; str.resize(255); ::RegSetValueEx(hKey, REGVAL_CREDENTIAL_CIPHERKEY, NULL, REG_BINARY, const_cast<char *>(str.c_str()) , str.size());

# re: 再谈从 vc6 迁移到 vs2005 论

回复 更多评

2006-03-13 22:01 by fiestay 不错. 不过现在还没有几乎将项目转到 2005 上,而且感觉 2005 很容易出问题.有时候编 译运行时,会提示找不到 MFC8.0.dll,真是 faint~~

# re: 再谈从 vc6 迁移到 vs2005 论
2006-03-14 10:26 by 1234

回复 更多评

VS 2005 出得有点让人失望,Bug 太多了,MS 应该推迟 VS2005 的发布 顺便问一下楼主,您知道如何编程程序控制显卡的双输出么,就是说希望将一个 界面输出到主显示器,另一个界面输出到从显示器. 谢谢

# re: 再谈从 vc6 迁移到 vs2005 论
2006-03-15 12:18 by stone 都常遇到哪些 Bug?

回复 更多评

# re: 再谈从 vc6 迁移到 vs2005 论

回复 更多评

2006-07-13 15:23 by jakeinus when I open a vc project in vc2005 and I debug the program,it has the following error,please tell me why,Thanks. Error 1 error C2146: syntax error : missing ';' before identifier 'PVOID64' c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h 222 Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h 222 Error 3 error C2146: syntax error : missing ';' before identifier 'Buffer' c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h 5940 Error 4 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h 5940 Error 5 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h 5940

I appreciate your help.


相关文章:
vc6.0迁移到vs2010中的问题的解决方法
vc6.0迁移到vs2010中的问题的解决方法_计算机软件及应用_IT/计算机_专业资料。...再谈从vc6迁移到vs2005 6页 免费 vc6[1].0++使用教程 10页 免费 vc...
VC++6.0版本程序转成VS2010版
同时得注意预编译头文件通常很大,通常有 6-7M 大。注意及时清理那些没有 用的...05-13 11:35 开发平台由 VC6.0 升级至 VS2005, 需 要将原有的项目迁移,...
VC6工程 迁移到 visual studio 2013-64位 编译
VC6工程 迁移到 visual studio 2013-64位 编译_计算机...(VS.85).aspx error LNK2019 error LNK2019: ...文档贡献者 hollyholly5 贡献于2015-05-13 专题...
VC6.0的项目怎样移植到VS2008和VS2010问答集
关于版本 vc6 最低, 然后下来是 VS 2003 VS2005...从 VC6 转到 VS2010, 直接用 VS2010 打开 VC6 ...vc6.0迁移到vs2010中的问... 6页 1下载券 VC+...
VS2010与VC++6.0的各种区别和移植代码问题总结
从VC6 到 VC9、VS2010 移植代码问题总结当年在学校学习 C 编程的时候用的是 TC2.0,后来学 C++用 TC3.0,有一天突然发现 Borland C++ 3.1 的 IDE 比较好用,...
VC6.0_工程转到VS2008一些问题的描述及解决方法
What it means is that they changes the return types from 2003 to 2005. ...VC6与VS2008类型转换 2页 免费 CButtonST从VC6移植到VS... 暂无评价 1页 1...
VC6.0和VS2005之间互相调用COM
这篇文章就是关于 COM 组件的编写和调用的,主要包含了使用 VC6.0 编写和调用 ...再谈从vc6迁移到vs2005 6页 5下载券 VS2005-2008线程调用 4页 免费 vs...
VC++6.0转到VS2008常出现的错误及解决方案
从VC++6.0 转到 VS2008,用着好不习惯,网上找到一帖子,转给大家,希望会有...VS6 中,在 FOR 循环中的循环变量的定义的作用域延伸到循环体外,VS2005 则...
从VC6到VC2008移植代码问题总结
并将其升级为 VS2008 的解决方案格式和项目格式(sln 和 vcproj) ,VC9 的编译...代码高处走 从VC6到VC9... 7页 1下载券 VC6代码向VC2005升级时要.....
vc6.0和vs2005差别
控件通知消息 WM_INITDIALOG 移到了重写 (Overrides...七、自 VS2005 起对消息的检查更为严格, VC6 中...(基于 COM )从 不再可行, VS2005 以自 来中...
更多相关标签: