Visual C++ 2010 中的新增功能
本文档介绍 Visual Studio 2010 中新增和增强的 Visual C++ 功能。
Visual C++ 编译器和链接器
auto 关键字
auto 关键字具有新的用途。 使用 auto 关键字的默认含义可声明这样的变量:需从变量声明中的初始化表达式推导出该变量的类型。 /Zc:auto 编译器选项可调用 auto 关键字的新含义或以前的含义。
decltype 类型说明符
decltype 类型说明符返回指定表达式的类型。 结合使用 decltype 类型说明符和 auto 关键字可声明复杂的或仅为编译器所知的类型。 例如,使用该组合可以声明一个模板函数,该函数的返回类型取决于其模板参数的类型。 也可以声明一个模板函数,该函数调用其他函数然后返回被调用函数的返回类型。
Lambda 表达式
Lambda 函数具有函数体但没有名称。 Lambda 函数组合了函数指针和函数对象的最佳特征。
将 lambda 函数本身用作模板函数参数而不是函数对象,或者将其与 auto 关键字组合使用,可以声明 lambda 类型的变量。
Rvalue 引用
Rvalue 引用声明符 (&&) 声明对 Rvalue 的引用。 rvalue 引用使您能够使用移动语义和完全转发来编写更高效的构造函数、函数和模板。
static_assert 声明
static_assert 声明在编译时测试软件断言,这与在运行时进行测试的其他断言机制不同。 如果断言失败,则编译也将失败,且系统将发出指定的错误消息。
nullptr 和 __nullptr 关键字
通过 Visual C++ 编译器,可以对本机代码或托管代码使用 nullptr 关键字。 nullptr 关键字指示对象句柄、内部指针或本机指针类型不指向对象。 如果使用 /clr 编译器选项,则编译器会将 nullptr 解释为托管代码;如果未使用 /clr 选项,则会解释为本机代码。
特定于 Microsoft 的 __nullptr 关键字与 nullptr 的含义相同,但前者仅适用于本机代码。 如果使用 /clr 编译器选项编译本机 C/C++ 代码,则编译器无法确定 nullptr 关键字是本机项还是托管项。 若要使编译器清楚地了解您的意图,请使用 nullptr 关键字指定托管项,使用 __nullptr 指定本机项。
/Zc:trigraphs 编译器选项
默认情况下,禁用对三字符组的支持。 使用 /Zc:trigraphs 编译器选项可启用三字符组支持。
三字符组由两个连续的问号(??)及后跟的第三个唯一字符组成。 编译器会将三字符组替换为相应的标点字符。 例如,编译器会将 ??= 三字符组替换为 #(数字字符)字符。 对于使用的字符集未包含某些标点字符的 C 源文件,可在其中使用三字符组。
新按配置优化选项
PogoSafeMode 是一个新的按配置优化选项,使用此选项可以指定在优化应用程序时使用安全模式还是快速模式。 安全模式是线程安全的,但比快速模式的运行速度慢。 快速模式是默认行为。
新公共语言运行时 (CLR) 选项/clr:nostdlib。
为 /clr(公共语言运行时编译)新增了一个选项。 如果包含同一库的不同版本,则会发出编译器错误。 使用该新选项可以排除默认的 CLR 库,以便程序可以使用指定版本。
新建杂注指令 detect_mistmatch
杂注指令 detect_mismatch 使您能够在您的文件中放置一个要与其他具有相同名称的标记进行比较的标记。 如果对于同一个名称存在多个值,则链接器将发出错误。
XOP 内部函数、FMA4 内部函数和 LWP 内部函数
添加了新的内部函数来支持 针对 Visual Studio 2010 SP1 添加的 XOP 内部函数、针对 Visual Studio 2010 SP1 添加的 FMA4 内部函数 和 针对 Visual Studio 2010 SP1 添加的 LWP 内部函数 处理器技术。 使用 __cpuid, __cpuidex 可确定特定计算机上支持的处理器技术。
Visual C++ 项目和生成系统
MSBuild
Visual C++ 解决方案和项目现在使用 MSBuild.exe(取代了 VCBuild.exe)生成。 MSBuild 同样是灵活的、可扩展的基于 XML 的生成工具,可由其他 Visual Studio 语言和项目类型使用。 由于此更改,Visual C++ 项目文件现在使用 XML 文件格式并具有文件扩展名 .vcxproj。 Visual Studio 早期版本的 Visual C++ 项目文件会自动转换为新文件格式。 有关更多信息,请参见 MSBuild (Visual C++)。
VC++ 目录
VC++ 目录设置现在位于两个位置。 使用项目属性页可为 VC++ 目录设置基于每个项目的值。 使用**“属性管理器”**和属性表可为 VC++ 目录设置基于每个配置的全局值。
项目到项目依赖项
在早期版本中,定义的项目之间的依赖项存储在解决方案文件中。 在这些解决方案转换为新项目文件格式时,依赖项会转换为项目到项目引用。 因为解决方案依赖项的概念与项目到项目引用的概念不同,所以此更改会影响应用程序。
宏和环境变量
新的 _ITERATOR_DEBUG_LEVEL 宏将调用对迭代器的调试支持。 使用此新宏取代旧的 _SECURE_SCL 和 _HAS_ITERATOR_DEBUGGING 宏。
Visual C++ 库
并发运行库
并发运行时框架支持同时运行的应用程序和组件,并且它是使用 Visual C++ 进行并发应用程序编程的框架。 为了支持并发应用程序编程,并行模式库 (PPL) 提供了用于执行细粒度并行操作的通用容器和算法。 异步代理库提供了用于粗粒度数据流和管道任务的基于角色的编程模型和消息传递接口。
标准 C++ 库
下面的列表描述了对标准 C++ 库进行的很多更改。
使用了新的 rvalue 引用 C++ 语言功能来为标准模板库中的很多函数实现移动语义和完全转发。 移动语义和完全转发极大地提高了分配或指派变量或参数操作的性能。
还使用了 rvalue 引用来实现新的 unique_ptr 类,这个新类是一个比 auto_ptr 类更安全的智能指针类型。 unique_ptr 类可移动但不可复制,在不影响安全的情况下实现严格的所有权语义,并且可以与了解 rvalue 引用的容器一起很好地工作。 auto_ptr 类已被弃用。
新增了 15 个函数,例如 <algorithm> 标头中添加了 find_if_not、copy_if 和 is_sorted。
在 <memory> 标头中,利用新的 make_shared 函数,可以在构造某个对象的同时轻松、可靠、高效地创建指向该对象的共享指针。
<forward_list> 标头支持单独链接的列表。
新的 cbegin、cend、crbegin 和 crend 成员函数提供可在整个容器中向前或向后移动的 const_iterator。
<system_error> 标头和相关模板支持处理低级别系统错误。
exception_ptr 类的成员可用来传输线程之间的异常。
<codecvt> 标头支持将 Unicode 字符的各种编码转换为其他编码。
<allocators> 标头定义了可帮助基于节点的容器分配和释放内存块的多种模板。
对 <random> 标头进行了大量更新。
Microsoft 基础类 (MFC) 库
Windows 7 功能
MFC 支持 Windows 7 的很多功能,例如,功能区用户界面 (UI)、任务栏、跳转列表、选项卡式缩略图、缩略图预览、进度栏、图标覆盖和搜索索引。 因为 MFC 自动支持 Windows 7 的很多功能,因此您可能不必修改现有应用程序。 若要支持新应用程序中的其他功能,可使用**“MFC 应用程序向导”**指定要使用的功能。
多点触控感知
MFC 支持具有多点触控用户界面的应用程序,例如,针对 Microsoft Surface 操作系统编写的应用程序。 多点触控应用程序可处理 Windows 触控消息和笔势消息(触控消息的组合)。 在您的应用程序注册触控事件和手势事件之后,操作系统就会将多点触控事件路由到您的事件处理程序。
高 DPI 识别
默认情况下,MFC 现在可以识别高 DPI。 如果应用程序可以识别高 DPI(每英寸像素数),则操作系统会将窗口、文本和其他 UI 元素缩放至当前屏幕分辨率。 这意味着,缩放的图像很可能是经过正确布局的,而不是经过剪切或像素化的。
重新启动管理器
重新启动管理器会在应用程序意外关闭或重新启动时,自动保存文档并重新启动该应用程序。 例如,在自动更新关闭某个应用程序后,您可以使用重新启动管理器来启动该应用程序。 有关如何将应用程序配置为使用重新启动管理器的更多信息,请参见如何:添加重新启动管理器支持。
CTaskDialog
可以使用 CTaskDialog 类来代替标准的 AfxMessageBox 消息框。 CTaskDialog 类比该标准消息框显示和收集的信息要多。
SafeInt 库
新的 SafeInt 库执行导致整数溢出的安全算术运算。 该库还会比较不同类型的整数。
新的活动模板库 (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 是否有效。
/analyze 警告
已从 C 运行时 (CRT)、MFC 和 ATL 库中移除大多数 /analyze(企业代码分析)警告。
动画和 D2D 支持
MFC 现在支持动画和 Direct2D 图形。 MFC 库中新增了一些 MFC 类和函数来支持此功能。 此外,还有新增了两个演练来分别演示如何将 D2D 对象和动画对象添加到项目中。 这两个演练分别为演练:向 MFC 项目添加 D2D 对象和演练:向 MFC 项目添加动画。
IDE
在 Visual C++ 2010 中,集成开发环境 (IDE) 在性能、准确性、可伸缩性和工具方面进行了显著改进,可帮助您提高生产效率。
改进的 IntelliSense
Visual C++ 的 IntelliSense 完全进行了重新设计,以便能够更快、更准确并且有能力处理更大的项目。 为了完成此次改进,IDE 对开发人员查看和修改源代码的方式与 IDE 使用源代码和项目设置生成解决方案的方式进行了区分。
由于这种责任分离,**“类视图”和新的“定位到”对话框这样的浏览功能将由一个基于新的 SQL Server 桌面数据库 (.sdf) 文件(取代了旧版的无编译浏览 (.ncb) 文件)的系统 进行处理。 IntelliSense 功能(例如,快速信息、自动完成和参数帮助) 仅在需要时才会分析转换单元。 混合功能(例如,新的“调用层次结构”**窗口)结合了浏览和 IntelliSense 功能。
因为 IntelliSense 仅在需要时才对信息进行处理,因此 IDE 的响应更快。 另外,由于信息更新,IDE 视图和窗口更准确了。 最后,由于 IDE 基础结构的组织更合理、处理能力更强并且可伸缩性更大,因此可以处理更大的项目。
改进的 IntelliSense 错误
IDE 可更好地检测可能会导致丧失 IntelliSense 功能的错误,并在错误下显示红色的波浪下划线。 此外,IDE 还会在**“错误列表”窗口中报告 IntelliSense 错误。 若要显示导致问题的代码,请在“错误列表”**窗口中双击错误。
#include 自动完成功能
IDE 支持 #include 关键字自动完成。 在键入 #include 时,IDE 会创建一个包含有效头文件的下拉列表框。 如果继续键入文件名,则 IDE 会基于输入来筛选该列表。 您可以随时从该列表中选择要包含的文件。 这样可快速地包含文件,而无需知道确切的文件名。
定位到
利用**“定位到”**对话框,您可以搜索项目中与指定字符串匹配的所有符号和文件。 随着您在搜索字符串中键入其他字符,搜索结果会即时进行修改。 **“结果”反馈字段会告知您已找到的项目数量,并帮助您决定是否要约束搜索。 “类型/范围”、“位置”和“预览”**反馈字段有助于您消除名称类似的项目的歧义。 另外,您可以扩展此功能以支持其他编程语言。
并行调试和分析
Visual Studio 调试器可识别并发运行时,帮助您排除并行处理应用程序的故障。 您可使用新的并发探查器工具直观地显示应用程序的总体行为。 此外,您可使用新的工具窗口直观地显示任务及其调用堆栈的状态。
功能区设计器
功能区设计器是一个图形编辑器,利用它可创建和修改 MFC 功能区 UI。 最终的功能区 UI 由基于 XML 的资源文件 (.mfcribbon-ms) 表示。 对于现有应用程序,您可通过临时添加一些代码行然后调用**“功能区设计器”**的方法来捕获当前功能区 UI。 创建功能区资源文件之后,可以使用一些用于加载功能区资源的语句来替换您手写的功能区 UI 代码。
调用层次结构
利用**“调用层次结构”**窗口,您可定位到由特定函数调用的所有函数,或定位到调用特定函数的所有函数。
工具
MFC 类向导
Visual C++ 2010 恢复了备受好评的 MFC 类向导工具。 通过使用**“MFC 类向导”**,可以很方便地向项目中添加类、消息和变量,而不必手动修改源文件集。
ATL 控件向导
ATL 控件向导不再自动填充**“ProgID”字段。 如果某个 ATL 控件没有 ProgID,,则其他工具可能无法用于该控件。 例如,“插入活动控件”**对话框就是要求控件具有 ProgID 的工具。 有关此对话框的更多信息,请参见“插入 ActiveX 控件”对话框。
Microsoft Macro Assembler Reference
新增的 YMMWORD 数据类型支持包含在 Intel 高级矢量扩展 (AVX) 指令中的 256 位多媒体操作数。