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

再谈从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迁移到vs2005
再谈从 vc6 迁移到 vs2005 Posted on 2006-03-13 11:03 小明 阅读(3880) 评论(9) 属分类: C/C++ 编辑 收藏 引用 所 http://www.cppblog.com/sandy/...
VC6 和 VS2003 转换到VS2005 时可能会遇到的问题以及解决方法
VS2003 转换到VS2005 时可... 6页 免费 再谈从vc6迁移到vs2005 6页 免费...VS2005 中有些可能引起内存越界的函数不建议使用了 In VS2005, some dangerous...
vc6.0迁移到vs2010中的问题的解决方法
vc6.0迁移到vs2010中的问题的解决方法_计算机软件及应用_IT/计算机_专业资料。...再谈从vc6迁移到vs2005 6页 免费 vc6[1].0++使用教程 10页 免费 vc...
VC6转到换高版本的问题与解决方法
4.消息映射 VS2005 对消息的检查更为严格,以前在 VC6 下完全正常运行的消息...vc6.0迁移到vs2010中的问... 6页 1下载券 VC6 和 VS2003 转换到VS... ...
VC6.0和VS2005之间互相调用COM
这篇文章就是关于 COM 组件的编写和调用的,主要包含了使用 VC6.0 编写和调用 ...再谈从vc6迁移到vs2005 6页 免费 VS2005 Web引用程序打包... 11页 免费 vc...
VS2003 转换到VS2005 时可能会遇到的问题以及解决方法
(c, "testtestts"); //ok with VC6, but not in VS2005 strcpy_s(c,...可能会对现有的程序有所影响,升级到 Visual C++ 2005 之前,必须要确定程序...
VC++6.0版本程序转成VS2010版
35 开发平台由 VC6.0 升级至 VS2005, 需 要将原有的项目迁移,可能碰到类似...' VS2005 对消息的检查更为严格, 以前在 VC6 下完全正常运行的消息映射在 ...
vc6.0和vs2005差别
七、自 VS2005 起对消息的检查更为严格, VC6 中没问题的 ON_MESSAGE(...八、 Components 里添加 ActiveX (基于 COM )从 不再可行, VS2005 以自 来...
VC6工程 迁移到 visual studio 2013-64位 编译
10 VC6 工程 迁移到 visual studio 2013 visual studio 2013 打开 vc6 ...(VS.85).aspx error LNK2019 error LNK2019: unresolved external symbol "__...
老生常谈从VB6迁移到VB net
老生常谈从VB6迁移到VB net_计算机软件及应用_IT/计算机_专业资料。Visual ...VB Power Packs 2.0 对应 VS2005,本人没有找到下载地址。 VB Power Packs 3.0...
更多相关标签:
vs2005迁移到2015 | vc6 vs2005 | vs2005和vc6.0 | vc 6.0 vs2005 | 数据库2005迁移到2008 | sql2000迁移到sql2005 | sql server 2005 迁移 | sql 2005 迁移 2008r2 |