VC 2010的重大变化
auto 关键字具有新的默认含义。由于使用旧含义的情况很少见,因此大多数应用程序都不会受此更改影响。
引入了新的 static_assert 关键字,如果代码中已经存在具有某个名称的标识符,则此关键字将导致名称冲突。
对新 lambda 表示法的支持不支持对 IDL uuid 特性中未加引号的 GUID 进行编码。
.NET Framework 4 引入了损坏状态异常概念,这些异常会导致进程处于无法恢复的损坏状态。默认情况下,即使使用捕获所有其他异常的 /EHa 编译器选项,也无法捕获损坏状态异常。
若要显式捕获损坏的状态异常,请使用 __try-__except 语句。或者,应用 [HandledProcessCorruptedStateExceptions] 特性以允许使用函数捕获损坏状态异常。
此更改主要影响可能必须捕获损坏状态异常的系统程序员。八个此类异常为 STATUS_ACCESS_VIOLATION、STATUS_STACK_OVERFLOW、EXCEPTION_ILLEGAL_INSTRUCTION、EXCEPTION_IN_PAGE_ERROR、EXCEPTION_INVALID_DISPOSITION、EXCEPTION_NONCONTINUABLE_EXCEPTION、EXCEPTION_PRIV_INSTRUCTION 和 STATUS_UNWIND_CONSOLIDATE。有关这些异常的更多信息,请参见 GetExceptionCode 宏。
修改后的 /GS 编译器选项可防止此版本中的缓冲区溢出比早期版本中的更广泛。此版本可能会在可降低性能的堆栈中插入附加的安全检查。使用新 __declspec(safebuffers) 关键字可指示编译器不对特定函数插入安全检查。
如果使用 /GL(全程序优化)和 /clr(公共语言运行时编译)编译器选项进行编译,则忽略 /GL 选项。进行此更改是因为组合使用编译器选项没有什么优点。进行此更改后,生成的性能得到了改进。
默认情况下,在 Visual C++ 2010 中禁用对三字符组的支持。使用 /Zc:trigraphs 编译器选项可启用三字符组支持。三字符组由两个连续的问号(“??”)及后跟的第三个唯一字符组成。编译器会将三字符组替换为相应的标点字符。例如,编译器会将“??=??三字符组替换为“#”字符。对于使用的字符集未包含某些标点字符的便捷图形表示形式的 C 源文件,可在其中使用三字符组。
链接器不再支持对 Windows 98 进行优化。如果指定 /OPT:WIN98 或 /OPT:NOWIN98,则 /OPT(优化)选项将会产生编译时错误。
由“RuntimeLibrary”和“DebugInformationFormat”生成系统属性指定的默认编译器选项已发生更改。默认情况下,在由从 7.0 到 10.0 版本的 Visual C++ 创建的项目中将会指定这些生成属性。 如果迁移由 Visual C++ 6.0 创建的项目,请考虑是否为这些属性指定值。
在 Visual C++ 2010 中,“RuntimeLibrary”设置为“MultiThreaded (/MD)”,“DebugInformationFormat”设置为“ProgramDatabase (/Zi)”。在 Visual C++ 9.0 中,“RuntimeLibrary”设置为“MultiThreaded (/MT)”,“DebugInformationFormat”设置为“Disabled”。
公共语言运行时 (CLR)
Microsoft C# 和 Visual Basic 编译器现在可以生成“非主互操作程序集”(非 PIA)。非 PIA 程序集可以使用 COM 类型而无须部署相关主互操作程序集 (PIA)。使用由 Visual C# 或 Visual Basic 生成的非 PIA 程序集时,在引用使用库的任何非 PIA 程序集之前,必须在编译命令中引用 PIA 程序集。
Visual C++ 项目和 MSBuild
Visual C++ 项目现在基于 MSBuild 工具。因此,项目文件会使用新 XML 文件格式和 .vcxproj 文件后缀。Visual C++ 2010 会自动将项目文件从 Visual Studio 早期版本转换为新文件格式。
如果某个现有项目依赖于先前的生成工具 VCBUILD.exe 或项目文件后缀 .vcproj,该项目将受影响。
在早期版本中,Visual C++ 支持属性表的后期计算。例如,父属性表可以导入子属性表,然后父属性表可以使用子属性表中定义的变量来定义其他变量。利用后期计算,即使在导入子属性表之前,父属性表也可以使用子变量。在 Visual C++ 2010 中,不能在定义项目表变量之前使用该变量,因为 MSBuild 仅支持早期计算。
集成开发环境
“应用程序终止”对话框不再终止应用程序。
在以前的版本中,当 abort() 或 terminate() 函数关闭应用程序的零售内部版本时,C 运行库将在控制台窗口或对话框中显示应用程序终止消息。该消息的部分内容为,“此应用程序已请求运行时以异常方式终止它。请与应用程序技术支持团队联系,以便获得更多信息。”
应用程序终止消息是多余的,因为 Windows 随后显示了当前终止处理程序,它通常是“Windows 错误报告”(Dr.Watson) 对话框或 Visual Studio 调试器。从 Visual Studio 2010 开始,C 运行库将不显示该消息。而且,运行时还将阻止应用程序在调试器启动前终止。
仅当您依赖于应用程序终止消息的以前行为时,才会进行此重大更改。
对于 Visual Studio 2010 具体而言,IntelliSense 无法用于 C++/CLI 代码或特性,“查找所有引用”无法用于本地变量,且代码模型不会从导入的程序集检索类型名称或者将类型解析为其完全限定名。
Visual C++ 库
SafeInt 类现在包括在 Visual C++ 中,不再需要单独下载。仅当您开发了一个也称为“SafeInt”的类时,才会进行此重大更改。
库部署模型不再基于“合成”机制,且不再使用清单。实际上,每个动态链接库的名称包含其版本号。
标准模板库
标头不再自动包含在许多其他头文件中。但是,如果您需要 标头中定义的独立迭代器支持,则会显式包含该标头。
在 标头中,移除了 checked_* 和 unchecked_* 函数。此外还在 标头中,移除了 checked_iterator 类并增加了 unchecked_array_iterator 类。
移除了 CComPtr::CComPtr(int) 构造函数。该构造函数允许从 NULL 宏构造 CComPtr 对象,但不是必需的,还允许从非零整数构造无意义结构。
CComPtr 仍可从定义为 0 的 NULL 进行构造,但如果从文本 0 以外的整数构造,则会失败。您最可能在以下伪代码描述的情况中遇到此问题。
复制
pair> myVar;
myVar = make_pair(x, NULL);
若要修复第二个语句,请使用 nullptr 关键字来替代 NULL 宏。
复制
myVar = make_pair(x, nullptr)
移除了以下 ctype 成员函数:ctype::_Do_narrow_s、ctype::_Do_widen_s、ctype::_narrow_s 和 ctype::_widen_s。如果应用程序使用上述任一成员函数,则必须将其替换为对应的非安全版本:ctype::do_narrow、ctype::do_widen、ctype::narrow 或 ctype::widen。
CRT、MFC 和 ATL 库
已移除用户支持,以生成 CRT、MFC 和 ATL 库。例如,未提供相应的 nmake 文件。但是,用户仍对这些库的源代码具有访问权限。并且将可能在 Visual C++ 团队博客中发表一篇文档,其中描述 Microsoft 用来生成这些库的 MSBuild 选项。
已移除对 IA64 的 MFC 支持。但是,仍提供对 IA64 的 CRT 和 ATL 支持。
MFC 模块定义 (.def) 文件中不再重用序号。此更改意味着,次要版本间的序号将相同,且 Service Pack 和快速修补工程版本的二进制兼容性将得到改进。
CDocTemplate 类中添加了一个新的虚函数。这一新的虚函数为 CDocTemplate::OpenDocumentFile。OpenDocumentFile 的早期版本具有两个参数。而新版本具有三个参数。若要支持重新启动管理器,派生自 CDocTemplate 的任何类都必须实现具有三个参数的版本。有关此函数的更多信息,请参见 CDocTemplate::OpenDocumentFile。新参数为 bAddToMRU。
宏和环境变量
不再支持环境变量 __MSVCRT_HEAP_SELECT。已移除此环境变量,且没有替换变量。
Microsoft Macro Assembler Reference
从 Microsoft Macro Assembler 编译器中移除了多个指令。移除的指令包括 .186、.286、.286P、.287、.8086、.8087 和 .NO87。