Visual Studio 2015 Update3 的C++ 编辑并继续

[原文发表地址] C++ Edit and Continue in Visual Studio 2015 Update 3 [原文发表时间] 2016/7/1 我们一直在改进C++的编辑并继续(EnC)功能 自从我们在Visual Studio 2015 发布它之后,EnC使用默认的调试引擎和VC140工具包。我们已经处理了相当多的客户反馈,同时在此基础上,我会在这篇博客中介绍 Update3(下载)和其它有关C++ EnC的最新进展。 快速回顾一下——编辑并继续允许您在调试的时候修改您的代码(举个例子,如果在运行的时候你在代码里发现了一个bug),调试器可以在调试的进程中应用代码的更改,并可以继续使用您的新代码进行调试!这可以帮助加快您的编辑->生成->部署->调试周期。您可以在我们之前的博客里找到更多的信息,同时在这里也有介绍如何使用C++的编辑并继续。 我们在Update3的修复 在静态库中旧代码(错误信息)的EnC: 在静态库中对源文件进行编辑会导致源信息的不匹配以及旧代码会有一个误导的“成功应用代码改变”的消息。目前这个问题已被修复,现在任何旧代码在任何情况下都应该包含一个关于为什么我们不能映射指令指针的警告说明。 在一些比较大的项目中,EnC崩溃/卡住时带有链接/DEBUG:FASTLINK调试信息: 自从链接开关FASTLINK泄露某些信息在obj文件中,而不是整合所有的信息到PDB中后,在运行大程序的时候VS会遇到和EnC有关的内存问题,目前已经解决了这个问题。 C1092错误/C4656警告:我们已经修复了很多臭名昭著的有关于“严重错误 C1092:编辑并继续不支持对数据类型的修改;需要重新生成”的不相关更改的错误。同时,如果你使用/WX(把所有的警告都视为错误)生成,编译器在EnC的时候这些会导致编译错误的误报,也不会发出“警告C4656:…数据类型是新的或已从最新的版本上更改,或者在其他地方被定义的不同” 在EnC上提高“应用代码更改…”的性能:我们已经减少了应用代码更改的时间(即:当你看到“应用代码更改…”的对话框时),并且让它快了3倍。 Update3的断点改变 允许预编译(只在本地):调试选项调试->选项->常规->允许预编译(只在本地)不再支持Visual Studio Update3和默认调试器。对边际性能的改进是之前的设置,没有功能上的影响。 快速EnC参考 C++编辑并继续的需求 生成设置(程序属性) C/C++->常规->调试信息格式:编辑并继续程序数据库(/ZI) C/C++->代码生成->启用最小重新生成:是的(/Gm) 链接器->常规->启用增量连接:是的(/增长的) 任何不兼容的链接器设置(例如/SAFESEH, 或者 /OPT:…)在生成时的都应该导致LNK4075警告(举个例子,由于‘/OPT:ICF’规范而忽略‘/EDITANDCONTINUE’) 调试设置(调试->选项->常规) 启用本地调试并继续 在“编辑并继续”中,任何不兼容的编译器或者链接器都会导致一个错误(举个例子,“‘file.cpp’在‘MyApp.dll’中链接的时候并没有启用“编辑并继续”。确保启用了增量链接,而且,//EDITANDCONTINUE指令是不容忽视的。”) 不兼容的设置和不支持的情况 调试器设置(调试->选项->常规): “要求源文件与原始版本完全匹配:在修改方法时,不选此选项会导致在EnC之后不正确的断点绑定,同时,随着更新3应用此选项的更改,会导致错误“‘要求源文件精确匹配原始版本’在调试选项>选项>中的“设置”需要启用编辑并继续。请检查此选项,然后再试一次。”  “允许预编译(仅限本机)“:在Visual Studio 2015中,默认调试器不再支持这个选项。 Windows 8/8.1 应用商城:这些程序使用VC 120的工具包和C…

0

VS2015 Update 3 RC版本中编译器的改进

[原文发表地址] Compiler improvements in VS 2015 Update 3 RC [原文发表时间] 2016/6/7 C++编译器团队希望大家感受VS 2015 UPdate3编译器中的各种酷炫。 相比第一个发售版本VS 2015 RTM, 这一版的编译器在兼容C++标准准则上已经取得了重要的进展。 Update 3版本针对以下特性进行了特性增强。 表达式SFINAE(匹配失败不是错误), nested namespaces(嵌套命名空间),generalized range-based for loops(泛型范围循环)。 最后,我们使用了新的编译开关来帮助你针对代码所依赖的C++ ISO标准进行切换。    于此同时, 我们也修复了近200个来自update2 版本中的编译器bug, 当中有许多Bug出自Connect。感谢你们的反馈。 当编译器源代码改变后,编译器将会提供定义明确的诊断信息,我们也会持续文档化每一个修复,并把修复带来的影响记录到这个页面: compiler conformance improvements documentation for VS 2015。  是的, 我们会积极修改bug,即使需要修改源代码.     让我们深入这些新特性吧. 这些修改大部分都是帮助我们的编译器更加兼容已经存在的C++11和C++14标准特性。有些修改甚至更具有意义,这些修改或许就是下一个C++标准特性. ·         Standards versioning: 在Visual studio C++ 2015 up3中,…

0

微软C/C++编译器中管理字符集的新选项

[原文发表地址] New Options for Managing Character Sets in the Microsoft C/C++ Compiler [原文发表时间] 2016/2/22 微软C/C++编译器在伴随着DOS操作系统, 16位windows操作系统和32/64位windows操作系统发展的同时,也在支持不同着字符集、代码页和编码。这篇文章不仅解释了过去我们的编译器是怎样工作的,而且还包含Visual Studio 2015 Update 2 CTP C/C++编译器中提供的一些新的编译选项开关,明确支持BOM-less UTF-8文件和控制执行字符集,请下载并试用它。关于Update 2中的编译器的其他改变可以查看这篇文章。 有一些非常好的在线资源很详细的描述了Unicode, DBCS, MSCS,代码页和其他相关知识,我不会尝试在这里重现它们,但我们会很快涵盖这些基本概念。The Unicode Consortium是一个学习Unicode编码非常好的网站。 我们主要会通过两个方面来让大家明白我们的编译器是怎样来处理不同的字符集的。第一个方面是如何解释源文件(源字符集)里的字节,第二个方面是它把什么字节写入二进制(执行字符集)。弄明白源代码在磁盘上是怎样编译和存储是非常重要的。 显式标记 Unicode编码 通过BOM(字节序标记)来标记Unicode文件是一种标准方式,BOM不仅能标记UTF-32、UTF-16和UTF-8,也可以判断它是否有高字节序和低字节序。通过BOM来表明字节的序列, 这些结果来自于从编码U+FEFF到任何正在使用的编码。UTF-8是一种字节流编码,所以实际上并没有排序字节需要被标记出来,但是UTF-8的标志通常仍然被叫做“BOM”。 隐式标记 Unicode编码 在支持Unicode之前的Windows(和DOS)操作系统, 其文本文件以没有迹象显示编码形式来存储,它是由应用程序来诠释的。在DOS中,ASCII范围外的任何字符都将被构建成视频卡来输出。在Windows中,这个被称为OEM(437)代码页,它包含一些非英文字符集,以及一些用于绘制文本周围框线的字符集。 Windows最终还是添加了对DBCS (双字节字符集) 和MBCS (多字节字符集) 的支持。至今仍然没有一个标准的方式来表示文本文件的编码是什么,无论系统代码页如何设置字节通常会被解释。当32位的Windows出现时,它为了UTF-16分割APIs或者设置另外的所谓的“ANSI”APIs,这些APIs用8个字节来表示当前文件中的Unicode编码。 注意:通常你是不能在Windows中设置系统代码页为Unicode代码页(或者UTF-16 和UTF-8), 所以在很多情况下,在一个老的应用程序中去来弄明白没有BOM的 Unicode编码,并不是一件容易的事情。 这也是现在常见的在UTF-8中不使用BOM的编码,大部分Linux环境下默认是这样的。虽然很多的Linux工具可以处理BOM, 但大部分工具却不能生成它。实际上没有BOM,很多简单的事情例如连接和追加文件也不用担心谁来写BOM。 怎样用微软C/C++编译器从一个文件中读取文本 在过去的某一时刻,微软编译器内部改用了UTF-8字符集。 所以,从磁盘上读取文件时会转换成UTF-8字符集。如果一个文件中有BOM,我们可以使用并读取指定的任意编码的文件并把它转换到UTF-8。如果一个文件中没有BOM,我们可以尝试通过看前8个字节来删除UTF-16编码中的低字节序和高字节序。如果这个文件看起来像UTF-16, 我们将把它当作一个包含UTF-16字节序标记的文件来处理。 如果没有字节序标记,而且它看起来也不像UTF-16, 那么我们可以用当前的代码页(调用GetACP的结果)来把磁盘上的字节转换成UTF-8。这个是否正确取决于文件中实际的编码是怎样的以及包含什么字符。如果文件中实际包含的是UTF-8编码,它将不能被识别为正确的系统代码页,不能被设置为CP_UTF8。…

0

VS2015 update 1: 新功能 – MPX

[原文发表地址] Visual Studio 2015 Update 1: New Experimental Feature – MPX [原文发表时间] 2016/1/20 10:00AM 导论: 这篇文章是关于在VS2015中支持Intel®内存保护扩展(Intel® MPX),文章的内容是由Intel公司的Gautham Beeraka, George Kuan,和Juan Rodriguez提供的。 概述: VS2015 update 1 于2015年11月30日发布, 在这个更新版本中包含了对Intel MPX编译和调试功能的支持。Intel MAX能够检查所有指针的读取和写入,以确保它们在已声明的内存范围内。这个技术可以检测缓存区的溢出,并且停止正在运行的程序以避免危及系统。它允许C/C++代码使用第六代 Intel 酷睿处理器(启用MPX的 平台) 中介绍的最新的MPX 指令集和寄存器。 微软Visual C++编译器和链接器现在有通过特定的命令行选项启动自动检测的能力。 这篇博客解释了你该如何使用MPX代码自动生成以及启用MPX调试二进制文件。如果你想了解更多的有关Intel MPX的信息,请查看Intel MPX Technology web page. 如何来启用MPX代码的自动生成功能 VS2015 Update 1 有一个新的编译选项: /d2MPX. /d2MPX当前支持: 检查写入内存时的潜在缓存溢出, 它可以保护本地的和公用的指针和数组。 扩展到函数调用来自动提示指针参数的边界。 在你的工程中启用MPX的代码自动生成功能: 在VS中,如图1所示在添加其他选项框(项目|属性|配置属性|C/C++|命令行|其他选项)中添加/d2MPX编译选项。 图1:添加…

0

Clang with Microsoft CodeGen 2016年1月)发布上线

[原文发表地址]Clang with Microsoft CodeGen (January 2016) released [原文发表时间]2016/1/21 2:34 AM 我们已经发布了一个带外的Clang/C2工具集,它包含了一些社区问题的修复和测试中发现的bugs。这是未来即将快速发布众多版本中的一个,来自用户的一些问题反馈会逐渐处理。这里我们只列出相较于之前版本的新变化, 更多关于Clang/C2工具的详细讨论,请参阅VS2015.1的Microsoft CodeGen in VS 2015 1。 这个更新仍然是基于Clang3.7的一些相关优选的社区问题修复,并且将C2.dll的版本修改为19.023413.0。 Microsoft Fixes 修复原子布尔类型std::atomic_flag,使其生成正确的静态代码. 修复了”Static Library for Universal Windows”模板在目标平台为ARM时,使用Clang/C2工具集的问题。 修复了Clang/C2 和Android MDD同时安装,共享的Clang编译器的目标定义文件被重写的问题。 改变了当从工具集Visual studio 2015(v140)切换到Clang/C2的一些默认参数, 使其更好的兼容新工具集(EH开启异常捕捉模式, PCH预定义头文件默认关闭)。 Community Fixes r254346 [PR25661]根据r254323, 恢复部分一部分r217213。 r254323 [MS Compat]在推演模板参数时,调整了之前的调用机制thiscall, 变为新的调用机制cdecl。 r253843 [MS ABI] 允许调用__RTDynamicCast。 r253523 [MS ABI] 让arbitrary entities加入 vftable的排列 r253013 [Sema]…

0

Visual Studio对安卓CMake 工程的支持

[原文发表地址] Support for Android CMake projects in Visual Studio [原文发表时间] 2015/12/16 3:16 AM CMake 是一个跨平台工程生成工具,它能让共享的C++跨平台代码在其他多种IDE环境和工程中重复利用。 在Visual Studio中,我们做了一些改变,使CMAKE能支持Android工具链。有了这一改变,你只需做最小的改动,就可以将现有的CMAKE工程变成Android目标平台的工程,你可以在Visual Studio打开你的工程,充分感受到我们丰富的Android集成开发环境的好处。 我们已经在努力做微软CMake 开源github资源库,也打算和Kitware合作将这些改变集成在公开的CMake资源库。 但是当下,下面是你们需要做的一些步骤。 前提条件,请在Visual Studio上安装Android MDD包 获取CMake 在Microsoft CMake 资源库的VCMDDSndroid下面。  请点击“Download ZIP”按钮 ,下载离线备份的VCMDDAndroid,并解压。            从https://cmake.org/download/安装CMake3.4.1,这是编译CMake做必须的,推荐Win32 安装器。  在解压缩的文件目录下,运行 cmake –G “Visual Studio 14” ,这个会从根目录下启动CMake ,大概会花15分钟左右。 这样将会使用Visual Studio 2015生成工具,和生成Visual Studio工程。目的是在Visual Studio中编译CMake。              在CMake运行后,在out文件中应该有Visual Studio 工程。 运行 msbuild cmake.sln,这将会编译CMake, 你可以在VS2015…

0

VS 2015 Update 1 中带微软代码生成的Clang

[原文发表地址]Clang with Microsoft CodeGen in VS 2015 Update 1 [原文发表时间] 2015/12/4 7:17 PM [这篇博客的作者是Dave Bartolomeo 和Clang/C2 团队的组员] 在开发和维护跨平台C++代码方面,其中一个改变就是针对不同平台的不同编译器的问题。 你写的一些针对Windows平台的代码,用Visual C++编译器可以编译成功,但那时你针对安卓平台的编译就会失败,那是因为Clang的标准规格更为严格,你的代码恰好是按照比较宽容的Visual C++编写的。又或者你针对iOS用了一些新的代码,Clang可以编译成功,但是才发现这些新的C++语言,Visual C++是还无法支持的,你只能想办法重新实现这个方法而不用这个新的语言特性,或者生成一个单独的能够用Visual C++编译的Windows实现方式。 为了能够更加方便的进行跨平台代码的开发,使在Windows 和其他平台更好的工作, 我们为Visual Studio单独发布了一个额外的编译工具集, 叫带微软代码生成的Clang编译器。这个编译器为C语言和C++语言使用开源的Clang解析,还有Visual C++ 编译工具的代码生成器和优化器。像对其他平台一样,你可以为Windows使用相同的Clang解析你的跨平台代码,还能够充分利用Visual C++优化器先进的优化功能。因为针对非Windows平台,新的工具也使用的是一样的Clang解析,你不需要在代码里写满令人讨厌的#ifdefs,只需要为不同的编译器说明下即可。同时你的代码中可以使用那些还没有被Visual C++ 编译器所支持的语言特性, 包括C99 复杂类型和C++ 14 扩展的constexpr的支持。因为基于Clang的编译器会长生和Visual C++编译器一样格式的调试的信息,所以你能感受到同样很棒的Visual Studio 调试器体验。 用新的编译工具所编译的代码能够和Visual C++ 2015 C和C++编译器所编译的其他代码相链接。通常,你可以使用带微软代码生成的Clang编译器来编译跨平台代码,用普通的Visual C++ 工具集来编译特定的Windows代码(例如,你的UI)。 请注意,带微软代码生成的Clang编译器现在是一个预览功能。 我们知道在很多方面它还不够完善,仍存在一些漏洞。我们希望你可以尝试使用这个新功能,明白它如在应用在你的代码工作上,并给我们反馈。 安装 在Visual Studio 2015 Update 1中,Visual Studio安装时开始进行功能选择时的UI界面,你会看到在“跨平台和手机开发\Visual…

0