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

再谈从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转到换高版本的问题与解决方法
6.数学函数检查 VS2005 中,数学函数的参数检查更为...但是从 VC7 开始, 的编译器开始遵守 C++ VC 标准...vc6.0迁移到vs2010中的问... 6页 1下载券 VC6...
VC++6.0版本程序转成VS2010版
同时得注意预编译头文件通常很大,通常有 6-7M 大。注意及时清理那些没有 用的...05-13 11:35 开发平台由 VC6.0 升级至 VS2005, 需 要将原有的项目迁移,...
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,...是没有定义且不可靠的; 现在, 再使用/EHs 时, 就可保证不会捕捉到结构化...
老生常谈从VB6迁移到VB net
老生常谈从VB6迁移到VB net_计算机软件及应用_IT/计算机_专业资料。Visual ...VB Power Packs 2.0 对应 VS2005,本人没有找到下载地址。 VB Power Packs 3.0...
VC6工程 迁移到 visual studio 2013-64位 编译
VC6工程 迁移到 visual studio 2013-64位 编译_计算机...(VS.85).aspx error LNK2019 error LNK2019: ...文档贡献者 hollyholly5 贡献于2015-05-13 专题...
vc6.0和vs2005差别
控件通知消息 WM_INITDIALOG 移到了重写 (Overrides...七、自 VS2005 起对消息的检查更为严格, VC6 中...(基于 COM )从 不再可行, VS2005 以自 来中...
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...
在VS2005中创建VC++项目的步骤
VS2005中创建VC++项目的步骤_计算机软件及应用_IT/计算机_专业资料。在 VS2005...代码智能提示工具 Visual.Assist.X.V10.6.1862,下载地址如 下: http://...
CButtonST从VC6移植到VS2008
CButtonST从VC6移植到VS2008_计算机软件及应用_IT/计算机_专业资料。1、修改 BCMenu.cpp 中的修改 void BCMenuData::SetWideString(const wchar_t *szWideString)...
更多相关标签: