细数Visual Stuido 2010中VC++的新特征

一、Visual C++工程及其构建系统

(一)MSBuild

现在,Visual C++解决方案和项目都使用MSBuild进行构建,从而取代了原来的构建工具VCBUILD.exe。对于其他的Visual Studio语言和项目类型,MSBuild提供了一样的灵活性,可扩展性和基于XML的构建支持工具。为此,Visual C++项目文件现在也使用了流行的XML文件格式,并具有.vcxproj文件扩展名。另外,从早期版本的Visual Studio中提供的项目文件将被自动转换为新的文件格式。有关MSBuild工具的更多信息,请参见文章“MSBuild(Visual C++)”。

(二)VC++目录

现在,VC++目录设置位于两个地方。你可以使用项目属性页来设置每个项目对应的VC++目录,也可以使用属性管理器和一个属性表来设置全局性的并且使每个配置值对应的VC++目录。

(三)工程依赖性

在VC++早期版本中,您可以定义存储在同一个解决方案中的项目之间的依赖性。如今在这些解决方案转换为新的项目文件格式后,相应的依赖性也被转换为项目到项目的引用。这种变化将会影响应用程序,因为解决方案依赖性和项目到项目的引用是不同的。

(四)宏与环境变量

新引入的_ITERATOR_DEBUG_LEVEL宏支持针对迭代器调用调试支持。你可以使用这个宏来代替较老的_SECURE_SCL和_HAS_ITERATOR_DEBUGGING宏。

二、Visual C++库

(一)/analyze警告

绝大多数的/analyze(企业代码分析)警告如今都已经被从CRT,MFC和ATL库中移除。

(二)重启动管理器

如果您的应用系统出现意外关闭或重新启动情况的话,重启管理器支持自动保存文件并重新启动您的应用程序。例如,当您的应用程序由于自动更新而关闭时您可以使用重启管理器来再次启动这个应用程序。欲了解更多有关如何将应用程序配置为使用启动管理器的信息,请参见《如何:添加重启动管理支持》一文。

(三)MFC库

新引入的CTaskDialog类可用于代替标准的AfxMessageBox消息框。CTaskDialog类能够显示和收集比标准的消息框更多的信息。

(四)新的ATL宏

又有新的宏被添加到ATL宏库中,以便进一步扩大原有的PROP_ENTRY_TYPE和PROP_ENTRY_TYPE_EX宏的现有功能。另外新增加的两个宏PROP_ENTRY_INTERFACE和PROP_ENTRY_INTERFACE_EX支持你添加一个有效的CLSID列表。最后一对新宏PROP_ENTRY_INTERFACE_CALLBACK和PROP_ENTRY_INTERFACE_CALLBACK_EX支持您指定一个回调函数,以确定某个CLSID是否是有效的。

(五)新库

新引入的SafeInt库能够确保执行安全的算术运算,从而有效地避免了经常出现的整数溢出问题。这个库还支持比较不同类型的整数。

三、集成开发环境(IDE)

(一)改进的错误智能感知支持

在Visual Studio 2010中,集成开发环境(IDE)支持更好地检测可能导致丢失智能感知支持的错误,并在这些内容下面显示以红色波浪下划线。此外,集成开发环境还支持把智能感知的错误输出到错误列表窗口中。要想观察导致问题的相关代码,你只需要双击错误列表窗口中的错误即可。

(二)#include自动完成特征

集成开发环境还支持#include关键字的自动完成。当您键入#include时,集成开发环境将自动创建一个包含有效的头文件的下拉列表供您选择。如果你继续输入一个文件名,集成开发环境将自动根据您的输入加以过滤。在任何时候,你都可以根据这个列表来选择你想要包括的文件。显然,这一功能可以让您快速地包括那些尚不确切知道文件名的文件。

四、Visual C++编译器和链接器

(一)auto关键字

如今,auto关键字有了新的用处。你可以使用默认的auto关键字来声明一个变量的类型是从此变量声明的初始化表达式中推导出的。而新的/Zc:auto编译器选项支持调用auto关键字的新意义或以前的意义。

(二)decltype操作符

decltype操作符能够返回一个指定表达式的类型。因此,你可以使用decltype操作符并结合使用auto关键字来声明一个复杂类型或者是仅为编译器所知晓的类型。例如,你可以使用这样的组合来声明一个模板函数,而此模板函数的返回类型取决于其模板参数的类型。或者,你还可以声明一个模板函数,而此模板函数调用另一个函数,然后返回被调用函数的返回类型。

(三)Lambda表达式

Lambda函数有一个函数体,但没有函数名。Lambda函数把函数指针和函数对象两者的最佳特性组合到了一起。

你可以使用一个lambda函数来作为模板函数参数以代替一个函数对象,或者联合使用auto关键字来声明一个lambda类型的变量。

(四)Rvalue引用

右值rvalue引用声明符(&&)能够声明对一个右值rvalue的引用。右值引用能够使你使用动态语义(move semantics)和完善转发(perfect forwarding)来编写更有效的构造函数,普通函数和模板。

(五)static_assert声明

static_assert声明有助于在编译时测试软件中的断言,这不同于其他那些在运行时进行测试的断言机制。如果断言失败,则编译失败并显示出指定的错误信息。

(六)nullptr和__nullptr关键字

Visual C++编译器允许您在本机代码或托管代码中使用nullptr关键字。nullptr关键字用于指出一个对象句柄、内部指针或本地指针类型并不指向一个对象。当您使用/clr编译器选项时,编译器将把nullptr解释为托管代码,而在不使用/clr选项时解释为本机代码。

微软特定的__nullptr关键字与nullptr关键字意思相同,但它只适用于本机代码。如果您使用/clr编译器选项编译本机C/C ++代码,那么编译器不能确定nullptr关键字是一个本地关键字还是托管关键字。为了使编译器更清楚地理解你的意图,你可以使用nullptr关键字来指定当前操作为托管操作,而使用__nullptr关键字来指定当前操作为本地操作。

(七)/Zc:trigraphs编译器选项

默认情况下,三字符组(trigraphs)支持是被禁用的。在这种情况下,你可以使用/Zç: trigraphs编译器选项来启用三字符组支持。

一个三字符组由两个连续的问号后面跟着一个独特的字符组成。编译器能够使用相应的标点符号来取代这个三字符组。例如,编译器能够使用#(数字符号)字符替代三字符组??=。你还可以在C源文件中使用三字符组,因为这些文件中使用的是不会包含某些标点字符的字符集。

(八)新的基于配置的优化选项

PogoSafeMode关键字是一个新的基于配置的优化选项。你可以使用PogoSafeMode关键字来指定你想使用安全模式还是快速模式来优化您的应用程序。注意,安全模式是线程安全的,但它比快速模式慢一些。快速模式是默认的优化行为。

(九)新的通用语言运行时(CLR)选项/clr:nostdlib

新引入了一个通用语言运行时(CLR)选项/clr:nostdlib。如果你的系统中包括了相同库的不同版本,那么编译器将显示错误提示。这个新的选项可以使你排除默认的CLR库,从而使你的程序可以使用一个特定的版本。

(十)新的pragma指令detect_mistmatch

新引入的pragma指令detect_mismatch能够支持您使用相同的名称来替换您的文件中的某个特定的标记(相对于其他的标记)。如果相同的名称拥有多个值,连接器会发出错误提示。

五、工具

(一)ATL控件向导

在ATL控件向导不再自动填充ProgID字段。如果一个ATL控件没有一个ProgID,那么其他工具可能无法使用这个控件。这样的一个工具的例子是“Insert Active Control”对话框。有关此对话框的更多信息,请参考文章“插入ActiveX控件对话框”。

(二)MFC类向导

Visual Studio 2010中重新引入了MFC类向导。如今,您可以在解决方案的任何地方调用类向导。MFC类向导允许您添加类、消息和变量,而不必手动修改单个的代码文件。

六、微软宏汇编器参考

新引入的YMMWORD数据类型支持AVX(英特尔高级矢量扩展)指令中包含的256位的多媒体操作数。

Visual C++延伸阅读

Visual C++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的…另外还有VB,VF.只是使用不同语言…

但是,VC++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。