Vs2010与VC的区别

Vs2010与VC的区别

Vs2010与VC的区别

最新推荐文章于 2025-06-27 15:04:47 发布

peikailou9869

最新推荐文章于 2025-06-27 15:04:47 发布

阅读量1.4w

收藏

4

点赞数

1

CC 4.0 BY-SA版权

文章标签:

.net

visual studio 2010

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/peikailou9869/article/details/71305921

本文对比了VS2010与VC6.0的区别,VS2010专注于.NET平台,支持C++/CLI,提供更好的C++特性支持,如STL和可变参数宏,同时对Windows新版本有更好的兼容性。VC6.0则专用于C++开发,不支持最新C++标准,且对.NET不兼容。VS2010的错误提示更优,安全性更高,但代码调整可能涉及宏定义、MFC和库函数的更新,移植工作需要注意兼容性问题。

摘要生成于

C知道

,由 DeepSeek-R1 满血版支持,

前往体验 >

VS2010与VC++编译器的区别:

1.VS2010并不是针对C++的,C++只是它的一小部分,它更加关注.net平台程序开发(主要是C#、VB,C++/CLI(C++在.net下的语言)),而VC++6.0是专注与C++开发,或者说VC6只能开发C++程序,在VC6.0时期还没有.net

2.vc6对最新的C++的标准完全不支持,STL的支持也有缺陷,更加不支持可变参数宏

vc2010能够支持部分C++的特性,完全支持STL,同时支持可变参数宏

3.vs2010添加很多微软.NET的新特性,支持更多种类的资源文件,帮助文档也非常丰富,相较于vc6更加适合开发软件产品。

vc6里面对COM的使用和后面的vc版本都有一些区别,这些可能导致以后在工作中遇到麻烦。另外,vc6对win7及其之后的版本支持并不好,很容易发生不兼容的情况。

4.默认编码不同,VC6默认是ansi,文件小速度慢。VS2010默认是unicode,文件大速度快

后者错误好找不用编译就出来了,bug少,更先进更强大,vc6有bug,但是编译快,文件相对较小

5.vs2010开发出来的程序可以自动根据特定的CPU翻译成高效的目标代码,VC6开发出来的程序,要想换成其它的CPU必须要重新开发

6.VC6的界面老旧,操作复杂,不完全符合C++的安全标准,但是是底层语言,与操作系统良好结合,使用广泛;VS2010可视化界面,安全可靠,支持C++标准,部署简

7.VS2010自带了winsock2库(第2版的库),每次都不用加Ws2_32.lib

MSDN online

移植的问题:

1.高级的编译器,在同一个基础下开发后,由于向前兼容,可以打开原始编译的工作平台

2.环境变量与宏设置

_WIN32_WINNT 与_WIN32_IE 设置冲突

设定的windows平台版本,与安装配置的ADK不相符合

#if _MSC_VER <= 1200 // MFC 6.0 or earlier

3.MFC出现的时候STL还没有成为C++的标准,所以MFC使用一套自己的模版库,比如CArray、CList、CMap等等,这些类型声明都在afximpl.h文件中。

4.为了显著增加CRT库的安全性,许多CRT函数都有了一个更安全的新版本,新版本和旧版本的区别就是新版本函数名多了一个_s后缀。鼓励使用安全切最新的版本,但是参数等变化很大,调整需要很多时间。

可以使用#pragma warning( disable : 4996 )预处理指令解除警告

5.新旧版本的MFC以及界面控件?中对ON_MESSAGE消息映射宏定义不同

旧版:

#define ON_MESSAGE(message, memberFxn) /

{ message, 0, 0, 0, AfxSig_lwl, /

(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM,

LPARAM))&memberFxn },

新版:

#define ON_MESSAGE(message, memberFxn) /

{ message, 0, 0, 0, AfxSig_lwl, /

(AFX_PMSG)(AFX_PMSGW) /

(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > /

(memberFxn)) },

新的

ON_MESSAGE宏使用C++的?static_cast?操作符代替了C类型的强制转换。

用户没有按照ON_MESSAGE宏的约定声明来定义消息响应函数,就会造成错误

旧版:

#define?ON_WM_NCHITTEST()?/?

{?WM_NCHITTEST,?0,?0,?0,?AfxSig_wp,?/?

(AFX_PMSG)(AFX_PMSGW)(UINT(AFX_MSG_CALL?CWnd::*)(CPoint))&OnNcHitTest?},?

新版:

#define ON_WM_NCHITTEST() /

{ WM_NCHITTEST, 0, 0, 0, AfxSig_l_p, /

(AFX_PMSG)(AFX_PMSGW) /

(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(CPoint) > (&ThisClass ::

OnNcHitTest)) },

返回值类型由UINT改成了LRESULT,再加上static_cast的严格检查而出错

6.新的C++编译器不再支持默认类型的变量定义

7.for 语句的变量作用域问题

8.strchr(_tcschr)、strpbrk(_tcspbrk ??)、strrchr(_tcsrchr)和strstr(_tcsstr)这四个函数在VC6的CRT库中定义的返回值都是char *(TCHAR *),所以以前的代码通常是这样使用的:TCHAR *cp = _tcschr( pszPath, _T('//') ); //使用*cp,可以通过cp指针修改pszPath的内容这其实是一个“漏洞”,因为如果pszPath是const char(TCHAR) *字符串,那么就表示它不希望修改字符串的内容,但是调用strchr(_tcschr函数后就可以通过cp指针修改其内容了,这岂不荒谬?所有在新版本的CRT库中,这几个函数的返回值都改成const

char *。

9.wchar_t *类型与USHORT *的转换错误