VC++ 编译器的版本

[原文发表地址]  VC++编译器的版本 [原文发表时间] 2016/10/05 从VS “15” preview 5开始,VC++团队在每一个VC++工具集的更新中都逐步更新内置预编译处理程序宏指令_MSC_VER的值。 为什么这么做? 多亏了VC++团队在ISO C++领域的实现做出的投入和取得的进展,我们已经迅速上线了客户从未见过的新的语言特征并且引进了新的一致性的更改,尤其是在VC++工具集的更新中。因此,客户需要在他们的源代码中用好的方法区分VC++(不只是主要的版本)的更新版本。例如,一个想要利用VC++的C++ 11 noexcept 操作符特征的程序通常要写: #if _MSC_VER >=1900 // …use noexcept here … #endif 怎么测试? 传统情况下,开发者编写有包含条件的代码片段测试内置预编译处理程序宏_MSC_VER的值和显示了VC++编译器主要发布版本的已知的值做对比。比如: _MSC_VER >=1900 测试VC++编译器在VS2015 RTM之后的任意发布的版本。这一直是我们推荐的做法。从VS 15“开始,我们一直在做的目的是每一次更新都让_MSC_VER的值有一个增量。 在给定参照点之后测试VC++更新或者发布,请使用 “>=”(大于或者等于)操作符来对比_MSC_VER和已知的引用值。另外,如果你用有几个参考点在互斥的状态下比较,我们推荐你根据参照值降序排列的方式排列要对比的值。例如,以下代码片段 #if _MSC_VER >=1900 // … #elif _MSC_VER >=1800 // … #else // … #endif 查看VS2015之后发布的编译器,然后查看VS2013之后发布的编译器,然后查看VS2013之前的较早发布的编译器。 <的顺序测试 如果你选择用小于操作符(<),那么我们推荐你根据参照值升序的方式排列你的参考值。 检测一个指定的编译器版本 偶尔,你可能会找一个特定的VC++发布版本。只有在这种情况下,你需要用到==操作符来比较_MSC_VER和已知的值。这种情况包括在一个熟知的VC++版本上处理一个bug。然而,一般情况下,我们推荐你用”>=”来降序排列你的tests。 在一个封闭集合中查找编译器版本 某些情况下会要求查找一个封闭集合中的编译器版本。例如,这个代码片段 #if _MSC_VER…

0

Visual Studio “15” preview 5现在可以使用了

[原文发表地址]  Visual Studio “15” preview 5现在可以使用了 [原文发表时间] 2016/10/05 Visual Studio “15” preview 5现在可以使用了。您可以在Visual Studio的博客上查看官方文件. C++ 开发人员可以重点关注以下几点: 更加快速的C++工程加载,编码,以及调试。 强制使用C++ Core Guidelines的C++ Core Checkers 也同Visual Studio一起发布了。 加强了对C++11 和C++14功能的支持,并且预备支持将包含在C++17标准中的特性。此次发布的版本也包含对广义常量表达式的全部的支持。 改进,修正并增加了标准模板库。 增强了C++代码生成循环和C++代码的安全。 智能感知过滤器和实验性的C++预测智能感知缩小了在特定类型列表中的结果的范围。 修改了导航到(现在所熟知的跳转到)和找到所有参考来提高代码导航体验。 受欢迎的扩展“Visual C++ for Linux Development” 现在也是Visual studio的一部分。 C++支持“打开文件夹”也支持概念验证CMake。 等等…… 如果想要了解此次发布版本的完整列表及一些已知的问题,请查看Visual Studio “15” Preview 5 Release Notes page. Preview5 FAQ也提供了一些常见问题的答案。 一如既往,我们欢迎您随时反馈您遇到的问题。您可以试着在Visual Studio的IDE中使用报告问题的功能来分享反馈,并且可以在开发者社区网站中查看。如果您没有在使用Visual Studio IDE, 您可以使用 报告问题的链接这个网站来反馈问题。…

0

VS “15”中更快的C++解决方案加载

[原文发表地址] VS “15”中更快的C++解决方案加载 [原文发表时间] 2016/10/05 自从Visual C++ 诞生以来它已经有了产品项目。直到Visual Studio 6, Visual C++ 才有了它自己的IDE。从Visual Studio.NET开始,C++移到了一个Visual Basic, C#,C++和其他工具共享的新的IDE上。这个新的IDE到处使用了COM和基于IVsHierarchy的Solution Explorer中的项。许多现有的项目系统是保持完整的,但它是通过使用一系列新的COM对象表现出来,这些COM对象是由IVsHierarchy 和其他接口实现的。 在Visual Studio 2010中,一些隐含的项目系统被从VCBuild改变到MSBuild。同时把文件的扩展名从.vcproj改到了.vcxproj。在这个阶段,已经存在的系列(和新的有关联的)COM对象被保存下来,但是后来的进入到“shim”对象中的项目被召入到一个新的项目系统中。这个新的项目系统最终将作为Visual Studio Project System (VSPS) 被熟知。 随着时间的流逝,开发人员也在创建越来越大的解决方案和项目。随之产生的问题是VS也需要越来越长的时间来加载这些不断增加的解决方案。每个项目要得到解析并且一个大型对象的图也要在内存中创建和保存,至少一个对象的每个节点都会在层次体系中被创建。这种方法需要花费大量的时间并占用很多的内存。Visual Studio也坚持去试着各种方法来支持大型项目。例如,你可以直接卸载项目来防止正在加载的项目以及ASL异步解决方案加载也被引入到Visual Studio 2013中。ASL是在后台的线程中来加载大部分的项目来确保UI 界面可以对其他的任务做出快速地反映。 因为ASL有很大的限制,我们会听到许多开发人员说他们宁愿等着整个解决方案完成加载和其他后台的工作完成之前去试着使用IDE。正如你所知道的开着解决方案去喝杯咖啡。 甚至当所有的项目完成加载后,仍然有其他的工作需要使用CPU和磁盘。在状态栏上,你可能已经习惯看到如下内容: 这个消息意味着我们正在做我们所说的“design-time build”。VSPS可以评估项目并指出什么将被构建和如何去构建。我们这样做是为了给每个项目中的每个文件生成命令行。然后和我们已经存储在浏览数据库中的信息做比较。如果数据已经改变了我们将会将新数据写入到数据库中。这个命令行被使用在智能感知中以及来解决被索引在浏览数据库中的头文件。 在“初始化”阶段之后你将会看到我们会检查一些陈旧的文件(如果有需要的话将会更新这些文件)。最后,状态栏上会显示准备完毕,然而如果这时你查看下任务管理器中,你将会发现CPU仍在被很大程度使用。在后台我们仍在做一些工作。第一个任务是加载每一个项目的“外部依赖”节点。每一个这个节点包含一些在项目中不十分明显的一些文件,这些文件被直接或间接地包含在项目里的其他文件中。完成这一步骤之后将会有一些隐形的步骤来检查数据库中的独立记录,例如一些我们索引的文件却没有被任何项目直接或间接的使用。当你每一次打开一个解决方案这些步骤都会一次产生即使自从你上次使用之后没有发生任何改变。 下面我们来看看Chromium解决方案的加载过程的每一步在Visual Studio 15 update 3中和VS 15 preview 5中所花费时间的比较。如果你看过Chromium网站操作指南你会知道这个解决方案是通过使用命令” gn gen –ide=vs out\Default”产生的。这个结果中的~4600项目,其中~1000是“解决方案文件夹”,其他的是.Vcxproj项目。 下面的结果是从我自己的Win 10机器上得到的, 配置是Intel Core i7-4790 @ 3.6GHz和两个SSDs:一个用作系统驱动器,另一个用来进行源代码工作(Samsung…

0

在 VS “15” Preview 5中关于C++14/17 Features 和STL的修复

[原文发表地址] 在 VS “15” Preview 5中关于C++14/17 Features 和STL的修复 [原文发表时间] 2016/10/11 Visual Studio15的预览版现在可以使用了。(正如我们在之前的变更日志中所解释的那样,VS“15”是一个新的IDE版本号,而不代表年。它是在VS2015(它的IDE版本号是14)之后的下一个版本。在VS中发布的年,IDE和C++编译器都有不同的版本号。) 预览5中增加了C++14中扩展的constexpr, 并且无条件地全面支持range-for(C++17中的这个变更在C++14中已经被确定要修复),也支持C++17中的static_assert, shared_ptr::weak_type, <optional>和<variant>。 我们也像往常一样 修复了很多编译器和类库的缺陷,而且解决了多于10个类库的问题。 另外,VS“15”后续版本会发布对C++17中的<any>, <string_view>, apply()和make_from_tuple()的支持。它也将包含对std::vector的正确性和性能的彻底修复。当前我们仍然为了VS“15”RC的发布而工作。现在,你可以尝试访问daily toolset builds,如果发现了任何缺陷,请报告在预览5或者daily toolset builds中。 编译器功能 C++03/11 Core Language Features VS “15” Notes [Everything else] Yes [A] Two-phase name lookup No Expression SFINAE Partial [B] C99 preprocessor Partial [C] Extended integer types N/A [D] C++14…

0

Visual Studio C++调试技巧和窍门

[原文发表地址] Debugging Tips and Tricks for C++ in Visual Studio [原文发表时间]2016/7/11 当我们第一次编写软件时,我们的目标是能够创建能正常运行的应用程序。不幸的是,它很少是这样的,我们要花大量的时间和精力去调试代码中的问题,而不是添加新的用途。幸运的是,当问题出现需要调查的时候,Visual Studio这个具有一流调试经验的工具能够帮助我们快速找到问题。然而,由于我们不知道或者只是忘了它提供快速解决问题的功能,致使我们很多人不能充分利用调试器。 在本贴中我将通过一个我最近展示的C++调试技巧和窍门的视频来简要介绍调试功能,这当然不包括一切,如果你想要更深入了解的话,每个功能都有相关的更加详细的信息。此外,每个在视频中展示的窍门都会包含一个精确的直接链接。 完成下列22条技巧后,让我们知道哪些是你新知道的,有没有人都知道这些?哪一个是你最喜欢的? 最后,请你在继续之前请花一分钟注册来帮助我们继续提升debugger以便更好的满足你的需要。 提示和技巧 从项目属性配置启动选项(1:25):开发软件是添加配置选项去改变行为或基于其他命令或环境变量去测试可选的设计是一种常见的模式,你能配置相同的命令参数并且为目标应用程序的”调试”选项卡上的项目属性页设置环境变量(在解决方案管理器中的项目上单击鼠标右键并且选择从菜单中选择”属性”)。 函数返回值(2:34): 当代码逐句通过调试器中,在自动窗口上显示你在上一行代码调用的所有参数的返回值。 设置下一个运行位置(3:16): 让你能够更改应用程序将要执行的下一个指令。这对返回到和重新调试已经执行过的语句是很好的。或者对强制应用程序下的不同代码的路径的测试功能很有用(例如,你甚至可以在条件计算结果为false条件块内移动执行)。你能通过单击和拖动左边边框黄色指令指针到所期待的行来改变下一个运行位置,或右键单击所期待的下一个运行行,然后从快捷菜单中选择“设置下一条语句”,又或者通过键盘快捷方式Ctrl + Shift + F10 来设置下一个运行位置的光标。需要指出的是这只是改变下一个指令运行的位置,如果你使它向前移动,它不会撤销任何以前已经运行的结果,如果你设置的是移动运行后面的代码,例如,如果设置了下一条运行语句而跳过一个变量的初始化,那么由于变量的继续初始化将导致应用程序的崩溃。  单步运行(4:07):当同一行有多个函数同时被调用时,不需要操作定义或者设置断点就允许你能够直接进入一个函数,然后继续执行命中的断点。单步运行可以通过右键单击当前行从编辑器的快捷菜单中访问,或者使用快捷键Shift + Alt + F11。  运行到光标处(5:05): 一次性使用断点功能是调试运行到该行并在停在该行。运行到光标处可以从编辑器上的上下文菜单中设置,也可以使用快捷键Ctrl +F10。另一个关于运行到光标处的有用的技巧是即使在设计时(当你在不调试),键盘快捷方式Ctrl + F10 将开始调试并运行该应用程序的那一行代码,就像你设置断点并且按了F5。 编辑并继续(6:57): 这是一个在调试代码时能够节省大量时间的方法,如果你注意到一个简单的错误并且你可以纠正它,你不需要停止调试和编译去运行应用程序返回到该位置。在Visual Studio 2015中我们添加了支持编辑和能够继续到包括基于支持x64的默认C++调试器。 异常设置(8:31):当指定的异常被引发时,我们可以设置调试器去停止,即使这个异常随后在应用程序中可能被捕获。这对于应用程序在处理异常而你需要调试为什么异常会发生时是非常有用的。 条件表达式,命中次数,断点过滤 (13:44):只有当应用程序中的某些条件得到满足(比如,当一个变量与一个固定的字符串匹配) 时,条件表达式会告诉调试器停止调试。中断的次数取决于断点击中的次数,当程序在断点处满足等于某个值,等于或者大于某个值,又或者是某个值的倍数时都会发生中断。如果你需要采用某种抽样的方法去处理问题(比如:只显示每100次的值),那么这种调试将会非常有用。过滤条件是为并行线程的情况所设计的,你可以在一个特定的线程、进程或者机器上终止执行。 固定数据提示(19:17):当在一个反复的代码路径里工作时(比如:循环),你总是集中在一个单一的值上。通过在编辑器上将鼠标悬停来查看变量是一种很好的方法,但是当你移开鼠标时数据提示就会消失。通过点击数据提示右侧的“图钉图标”可以使数据固定在编辑器上变量所在那行源代码处,直到你关闭它为止。 并行堆栈窗口 (19:42):用一个简明的窗口显示在这个进程中所有线程的调用堆栈,这个并行堆栈窗口通过调试->窗口打开。 显示外部代码(20:30):Visual Studio默认启动的功能我们称之为仅我的代码,它可以帮助你专注于你的代码, 你可以通过控制在调用堆栈窗口有折叠操作系统和运行帧成为一行单独的标签为[External Code]的帧,如果你想或者需要看到完整的堆栈,你可以右键单击调用堆栈或并行堆栈窗口以显示完整的调用堆栈。如果你希望这种方式的调试总是关闭的,你可以将调试->选项下的“仅我的代码”永久禁用。 并行监视窗口(22:00): 显示某一个变量在当前函数中所有所执行的线程的值。它也会显示在循环方法中相同变量在所有堆栈帧的值。…

0

VS “15” Preview 4中C++14/17特性和对STL的修复

  [原文发表地址] VS “15” Preview 4中C++14/17特性和对STL的修复 [原文发表时间] 08/24/2016 Visual Studio “15”Preview 4现在可以使用了,这是新的安装包。(VS“15”是IDE的版本号,不是年份。它是继VS2015之后的下一个主要版本,VS2015就是IDE 14。VS针对年份,IDE版本和C++编译器版本都有不同的编号。)   所有在VS2015 Update 3中的特性和修复 (包括为std::abs(),std::min(),std::max()和std::pow()所做的优化改进,这些我们之前忘了说)都可以在VS“15”Preview 4上使用。此外,我们还有一些新东西要宣布。以前,新的主IDE版本会包含新的主编译器版本和不兼容二进制的STL(这允许我们为了准确性和性能而去改造我们的数据结构表征)。现在,我们已经将特性添加到了编译器上,并且在VS2015 RTM以来,STL一直处于高度兼容的方式,我们会继续将这些延伸到新的主IDE版本中。具体来说,VS2015和VS“15”将会拥有相同的主编译器版本(19)和兼容二进制的STL, 并且这个兼容的编译器和STL将会在VS“15”的整个生命周期中保持可用。这意味着STL的动态链接文件将继续命名为msvcp140.dll。(在将来的某一刻,我们期望再次有一个编译器20版和不兼容二进制的STL。)   注意,我们可以确保二进制兼容性,但不保证源代码兼容性。虽然版本开关/std:c++14(默认选项)常常会保持源代码兼容性,它通常会为了修复bug或者解决问题而去请求改变源代码。虽然我们尝试去避免不必要的源代码重大改变,但在有必要的时候我们也会在MSDN上说明一下,正如我们在VS2015 Updates上做的一样。请注意/std:c++latest将会频繁的发生重大改变,但我们也会将这个改变记录下来(尤其是在STL中,随着我们根据最新的工作文档来更新我们的实施,这样可能会出现一种我们没有立刻意识到的意外的方式去破坏源代码,因此在这里警示一下)。   很明显,这是对于我们的程序员用户来说是一个好事情。尽管主编译器版本仍然是19,但我们还是添加了新的编译器和STL特性。((_MSC_FULL_VER将会增加,允许已更新的编译器被检测到)。并且STL的二进制兼容性意味着第三方库可以被构建一次并且被用于VS2015和VS“15”。(然而,使用最新的可用版本的编译器编译仍然是最好的,因为它会给你最好的准确性和性能。)现在,以下是我们添加的东西:   编译器特性 C++14特性NSDMIs for aggregates已经被Vinny Romano在没有任何附加条件的情况下实现了。 C++17特性[[fallthrough]] attribute 已经被Shuo Chang实施在/std:c++latest之下了。   STL特性 C++17特性<algorithm> sample()已经被实施在/std:c++latest之下了。 C++17特性is_callable已经被实施在/std:c++latest之下了。(is_nothrow_callable的实现在Preview 4中被一个编译器bug中断了, 这个bug将会在下一个build中被修复。)   LWG问题 下列C++14类库问题的决议已经被无条件的实施了: LWG 2135 在condition_variable::wait() 关于异常抛出的不明确规定 LWG 2203 scoped_allocator_adaptor 使用错误的参数类型来进行分段构造 LWG…

0

在VS2015 Update 3 中关于STL的修复

[原文发表地址] 在VS2015 Update 3中关于STL的修改 [原文发表时间] 2016/8/12 大概在一个月以前, 我们发布了VS 2015 Update 3 。 下面详细地列举了其中关于STL 的修复。 (之前的更新日志:RTM Part 1, RTM Part 2, Update 1, Update 2 features, 和Update 2 fixes.)   STL 模块 /std:c++latest 引入了下面的新特性: P0025R1 “clamp()”, P0185R1 “is_swappable, is_nothrow_swappable”以及 P0272R1 “Non-const basic_string::data()”.   然而/std:c++latest 也摒弃了一些旧特性:N4190 “移除了auto_ptr, random_shuffle()以及旧的<functional> Stuff “,P0004R1 “移除了不合理的Iostreams 别名”, LWG 2385 “function::assign allocator 参数没有意义”以及各种各样的非标准特性(…

0

Visual Studio Code 的C/C++ extension八月份更新

[原文发表地址]August Update for the Visual Studio Code C/C++ extension [原文发表时间]2016/8/29 在今年的//Build大会上我们推出了C/C++ extension for Visual Studio Code , 我们将保持每月发行的节奏和目标并不断对你们的反馈做出回应。下面将介绍八月份更新的一些功能: 使用 Visual Studio Code来调试你的微软应用程序 使用clang-format提高你的代码格式化的体验 改善了代码自动填充功能 如果您还没来得及给我们提供反馈,为了这个扩展能够更好的满足您的需要,请您填一下这份快速调查问卷。最初的博客中已经更新了这些新功能,现在让我们一起仔细地逐一学习一下他们。 使用 Visual Studio Code来调试你的微软应用程序 随着这次八月份更新版本的发布我们很高兴地宣布我们已经在Visual Studio Code C/C++ extension 中添加了支持调试微软桌面应用程序的功能! 你可以通过下面的步骤来调试你的微软应用程序: 在Visual Studio Code的侧边栏通过Debug视图进入 点击设置(齿轮)图标 选择”C++(Windows)” 你需要将“program”字段的值设置为正在调试的两种配置(launch ,attach)的可执行文件 为了给调试器配置其他可以去查找symbol文件的路径,我们在launch.json文件中添加了“symbolsearchpath”属性(用分号分隔多个路径) 这个微软调试的预览支持添加下列功能: 调试X86/x64应用软件 支持Launch和Attach桌面应用程序 设置断点(文件, 行,条件和函数) 逐步调试 时间和数据提示 堆栈 Symbol 设置(‘symbolsearchpath’) 多线程调试…

0

Github提供了微软Visual C的Range-v3特性

[原文发表地址]Range-v3 on MSVC is Available on GitHub [原文作者]EricMittelette [原文发表时间]2016/8/23  我们在Microsoft GitHub repo上发布了 已被visual C++ 团队实现的range-v3功能. 对于紧接着发布的visual studio 2015 UP3 vc++编译器中,range-v3特性对于改进编译器 expression SFINAE(模板匹配失败不是错误)特性做出了相应的贡献.这是第一个在MSVC上实现的range特性标准版. 在标准文档N4128(Ranges for the Standard Library, Revision 1)中。 Ranges被定义为如下: 一个Range作为一个对象可以引用连续的元素,从概念上来看,Range类似于迭代器中的pair。Range特性的主要目的是提供给用户当调用算法STL库时可以使用更简单的语法书写。 不使用Range特性前要这样写: std::vector<int> v { /*…*/ }; std::sort( v.begin(), v.end() ); 使用Range特性语法更加精简: std::sort( v ); 更多关于Range-v3的特性请参考:here C++团队重视Range特性的支持, 我们不仅雇佣了专门维护这个特性的工程师(Casey Carter), 而且根据市场的调查, 我们会继续使这个特性覆盖到整个编译器.(从代码解析到代码生成). 这次发布的库虽说还属于早期的beta版本, 但是绝大多数特性都已包含中其中。这个Branch将不会包含在MSVC中,而作为独立部分不断向完整的range特性进行扩展. 此次的功能实现已经可以工作在vs2015 up3中,…

0

在Centennial project中使用C++运行环境

[原文发表地址]Using Visual C++ Runtime in Centennial project [原文发表时间] 2016/7/7 前言: 在VS2015的更新中,我们提出了Desktop Bridge(以前叫做Project Centennial),给UWP添加桌面应用程序。利用桌面应用程序转换器,你可以把你的桌面应用程序打包成一个appx包部署到window10 桌面上。参考链接https://developer.microsoft.com/en-us/windows/bridges/desktop可以对Desktop Bridge了解更多. 如果你想转换你的C++ 桌面应用程序(如:win32, MFC等等), 你就必须处理VC++运行配置,例如vcruntime140.dll,像平时对C/C++应用程序所做的操作一样。 我们对 VC++ 11.0版本,12.0版本和14.0版本提供了Visual C++运行环境支持。通过Window存储, 集中部署VC++ runtime DLLs. 这个Runtime是CRT, STL,   ConCRT, MFC, ATL和C++ amp 建立的桌面Visual C++库。从Window下载中心可以下载这些可用的VC++ runtime服务版本: VC 14.0 framework packages for Desktop Bridge VC 12.0 framework packages for Desktop Bridge VC 11.0 framework packages for Desktop…

0