<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>C++</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/c/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/c/feed.xml</link>
    <description />
    <lastBuildDate>Fri, 20 Jul 2018 02:03:34 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>宣布模板智能感知</title>
      <link>https://docs.microsoft.com/archive/blogs/c/%E5%AE%A3%E5%B8%83%E6%A8%A1%E6%9D%BF%E6%99%BA%E8%83%BD%E6%84%9F%E7%9F%A5</link>
      <pubDate>Fri, 20 Jul 2018 01:58:40 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6625</guid>
      <description><![CDATA[[原文发表地址] https://blogs.msdn.microsoft.com/vcblog/2018/06/26/template-intellisense/

[原文作者] Nick...]]></description>
      <content:encoded><![CDATA[[<span>原文发表地址</span>] <a href="https://blogs.msdn.microsoft.com/vcblog/2018/06/26/template-intellisense/">https://blogs.msdn.microsoft.com/vcblog/2018/06/26/template-intellisense/</a>

[<span>原文作者</span>] <a href="https://social.msdn.microsoft.com/profile/Nick+Uhlenhuth"><span>Nick Uhlenhuth</span></a>

[<span>原文发表时间</span>] 6/26/2018

使用函数模板和类模板的C++<span>开发人员现在可以在模板体中的充分利用智能感知。在</span>Visual Studio 2017 15.8 Preview 3<span>中，当您的插入符号位于模板中时，一个名为“模板栏”的新</span>UI<span>元素会出现在模板定义的旁边，模板栏允许您为智能感知提供示例模板参数。</span>

例如，让我们在algorithm.hpp<span>里面看一下函数模板</span>is_partitioned_until<span>的</span>Boost库 (<span>我对此稍作修改</span>) <span>。 我们可以使用模板栏为智能感知提供一个</span> InputIterator<span>类型和</span>UnaryPredicate 类型的示例。
<ul>
 	<li><span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">单击</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">&lt;T&gt;<span lang="ZH-CN">图标以展开</span>/<span lang="ZH-CN">折叠模板栏。</span></span></span></li>
 	<li>单击铅笔图标或双击模板栏以打开编辑窗口。</li>
</ul>
<a href="https://msdnshared.blob.core.windows.net/media/2018/07/templateGif1.gif"><img width="887" height="242" class="alignnone wp-image-6635" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/templateGif1.gif" /></a>

请注意我们能够在名为myPredicate<span>的</span>UnaryPredicate <span>上使用</span>decltype <span>。有了这些信息，我们在编辑模板主体时就拥有了智能感知的全部功能。我们得到了所有恰当的曲线，快速信息，参数帮助等。</span>

我们考虑到模板栏信息是针对特定用户的，因此将它存储在.vs<span>文件夹中，而不是在提交时共享。</span>

<strong>下一步是什么呢？</strong>

下载最新的<a href="https://www.visualstudio.com/vs/preview/"><span>Visual Studio 2017 Preview</span></a>预览版并尝试使用您的项目。要禁用/<span>启用该特性，请转到工具</span>&gt;<span>选项</span>&gt;C/C++&gt;<span>高级</span>&gt;<span>智能感知</span>&gt;<span>启用模板智能感知。</span>

我们将在后续版本中继续改进这个特性。我们已经计划支持嵌套模板并处理Visual Studio<span>外部的编辑。</span>

和所有新特性一样，您的反馈对于指导我们的发展非常重要。您可以在Twitter<span>上</span><a href="https://twitter.com/NickUhlenhuth"><span>@nickuhlenhuth</span></a>向我发送您的反馈，或者联系Visual Studio C++<span>团队</span><a href="https://twitter.com/visualc"><span>@visualc</span></a>或visualcpp@microsoft.com<span>。</span>]]></content:encoded>
    </item>
    <item>
      <title>Visual Studio 2017 15.8 Preview 3中新的实验性代码分析功能</title>
      <link>https://docs.microsoft.com/archive/blogs/c/visual-studio-2017-15-8-preview-3%E4%B8%AD%E6%96%B0%E7%9A%84%E5%AE%9E%E9%AA%8C%E6%80%A7%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90%E5%8A%9F%E8%83%BD</link>
      <pubDate>Wed, 18 Jul 2018 08:30:00 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6595</guid>
      <description><![CDATA[[原文发表地址]...]]></description>
      <content:encoded><![CDATA[[<span>原文发表地址</span>] <a href="https://blogs.msdn.microsoft.com/vcblog/2018/06/26/new-experimental-code-analysis-features-in-visual-studio-2017-15-8-preview-3/">https://blogs.msdn.microsoft.com/vcblog/2018/06/26/new-experimental-code-analysis-features-in-visual-studio-2017-15-8-preview-3/</a>

[<span>原文发表时间</span>]2018/06/26

Visual C ++团队一直致力于在Visual Studio中提高我们的代码分析体验。 我们的目标是使这些工具更加实用和自然，并希望无论您是什么样式或项目类型的工作流程，它们都将使您受益。

&nbsp;

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 18pt"><span style="color: #000000">尝试新功能</span></span>

在<span><a href="https://visualstudio.microsoft.com/vs/preview/">预览版频道</a></span> <span>中提供的</span>Visual Studio 2017 15.8 preview 3中，我们介绍了一些新的正在进行的代码分析功能。 在默认情况下，这些功能是关闭的，但您可以在工具&gt;<span>选项</span>&gt;<span>文本编辑器</span>&gt; C ++&gt;<span>实验</span>&gt;<span>代码分析下启用它们。 我们鼓励您对其进行测试，并提供您的任何反馈或意见</span>。

&nbsp;

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 18pt"><span style="color: #000000">背景分析</span></span>

启用代码分析功能后，现在就可以在通过打开或保存C ++文件来在后台运行代码分析！ 我们的目标是将代码分析警告带入到编辑体验中，以便可以更早地修复错误，而不仅只是在运行时才会发现缺陷。 一旦对文件进行代码分析后，警告将显示在错误列表中，而在编辑器中则会显示为波形。

&nbsp;

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 18pt"><span style="color: #000000">编辑内警告</span></span>

与背景分析一起，代码分析警告现在在编辑器中显示为相应源代码下方的绿色波形。 如下图，如果通过更改文件来修复警告，则波形不会的自动刷新。 如果文件已经保存或者重新运行当前文件的分析（Ctrl + Shift + Alt + F7<span>），则形形和错误列表会被更新。通过提供给您在同一位置进行代码编写和编辑的功能</span>，我们希望这些视觉提示器能对您有帮助。

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/1111.png"><img width="569" height="447" class="alignnone size-full wp-image-6605" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/1111.png" /></a>

&nbsp;

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 18pt"><span style="color: #000000">错误列表</span></span>

代码分析警告将会一直显示在错误列表中，对此我们也在试图改善这种体验。 错误列表中的过滤应该更快。 我们鼓励使用“当前文档”过滤器去查看正在编辑的文件的错误， 这是与背景分析功能互相配合的。 警告详细信息也会在错误列表中以内联方式显示，而不是在单独的弹出窗口中显示。 我们相信错误附近的细节可以更容易地挖掘警告。 新的错误列表体验仍在进行中，因此请告知我们应该考虑的任何“必备”功能。

&nbsp;

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 18pt"><span style="color: #000000">未来展望</span></span>

我们很高兴能够展示未来会发生什么，但是在现在您可能会遇到一些已知问题。 首先，运行后台分析时仅使用“推荐的本机规则”规则集。 然后，并非所有项目类型都支持背景分析。 您可以尝试通过菜单运行代码分析来强制信息刷新。 最后，清除信息的最佳方法是“清理”构建或关闭实验功能。

随着背景分析运行的改进，突出显示多线警告、改变曲线以显示警告何时过时、自动修复等在以后都会进行考虑。 这些类似IntelliSense<span>的选项能够使您直接在编辑器中快速更正或更改代码，并准确查看将要更改的内容</span>。

&nbsp;

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 18pt"><span style="color: #000000">提供反馈</span></span>

感谢所有帮助Visual Studio能为所有人提供更好体验的人。 您的反馈对于确保我们提供最佳代码分析体验至关重要，因此请在下面的评论中告诉我们<span><a href="https://visualstudio.microsoft.com/vs/preview/">Visual Studio 201715.8 preview 3</a></span>是如何为您服务的。 您也可以通过Visual Studio<span>中的</span><span><a href="https://docs.microsoft.com/en-us/visualstudio/ide/how-to-report-a-problem-with-visual-studio-2017">报告常规问题</a></span>来进行反馈，同时可以通过<span><a href="https://visualstudio.uservoice.com/forums/121579-visual-studio-2015/category/30937-languages-c">UserVoice</a></span>提供任何建议，或者也可以在Twitter<span>上找到我们（</span><span><a href="https://twitter.com/visualc">@VisualC</a></span>）。]]></content:encoded>
    </item>
    <item>
      <title>在Visual Studio中宣布C ++仅在我的代码中单步执行</title>
      <link>https://docs.microsoft.com/archive/blogs/c/%E5%9C%A8visual-studio%E4%B8%AD%E5%AE%A3%E5%B8%83c-%E4%BB%85%E5%9C%A8%E6%88%91%E7%9A%84%E4%BB%A3%E7%A0%81%E4%B8%AD%E5%8D%95%E6%AD%A5%E6%89%A7%E8%A1%8C</link>
      <pubDate>Wed, 18 Jul 2018 07:55:30 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6355</guid>
      <description><![CDATA[[原文发表地址]：Announcing C++ Just My Code Stepping in Visual Studio

[原文发表时间]：2018年6月26日

[作者]：Marian...]]></description>
      <content:encoded><![CDATA[<span>[<span lang="ZH-CN">原文发表地址</span>]<span lang="ZH-CN">：</span><a href="https://blogs.msdn.microsoft.com/vcblog/2018/06/29/announcing-jmc-stepping-in-visual-studio/">Announcing C++ Just My Code Stepping in Visual Studio</a></span>

<span>[<span lang="ZH-CN">原文发表时间</span>]<span lang="ZH-CN">：</span>2018<span lang="ZH-CN">年</span>6<span lang="ZH-CN">月</span>26<span lang="ZH-CN">日</span></span>

<span>[<span lang="ZH-CN">作者</span>]<span lang="ZH-CN">：</span></span><span><a href="https://social.msdn.microsoft.com/profile/Marian+Luparu+%5BMSFT%5D">Marian Luparu [MSFT]</a></span><span> </span>

在Visual Studio 2017<span>发行版</span>15.8<span>预览版</span>3<span>中，我们宣布在</span>C ++<span>中支持逐步执行我的代码。 除了以前支持的</span><a href="https://blogs.msdn.microsoft.com/vcblog/2013/06/26/just-my-code-for-c-in-vs-2013/"><span>回调过滤</span></a><span>之外，</span>Visual Studio<span>调试器现在还支持单步执行非用户代码。 当您“进入”时，例如在带有自定义谓词的标准库中的算法或具有用户回调的</span>Win32 API<span>，调试器将方便地进入您提供的谓词或回调 ，而不是使用的库代码。 最终将调用你的代码。</span>

<span lang="ZH-CN">去年在</span><span>CppCon 2017<span lang="ZH-CN">上宣布的</span><a href="https://blogs.msdn.microsoft.com/vcblog/2017/11/16/improving-the-debugging-experience-for-stdfunction/"><span lang="ZH-CN">在</span>std :: function<span lang="ZH-CN">调用中的调试改进</span></a><span lang="ZH-CN">得到了非常热烈的接受后，该团队一直在为这个调试挑战开发通用解决方案，不需要在库代码中进行任何注释。</span> 15.8预览3今天可以获得此支持，我们期待您的反馈<span lang="ZH-CN">。</span></span>

如何启用逐步执行我的代码（JMC<span>）</span>
<ul>
 	<li><span style="color: #000000"><span lang="ZH-CN">您的程序使用新的</span><span><span style="font-family: Calibri">MSVC</span></span><span lang="ZH-CN">编译器开关编译：</span><span><span style="font-family: Calibri">/ JMC</span></span><span lang="ZH-CN">。</span><span lang="ZH-CN"><span style="font-family: Calibri"> </span></span><span lang="ZH-CN">默认情况下，</span><span><span style="font-family: Calibri">JMC</span></span><span lang="ZH-CN">在所有调试配置中都是</span><span><span style="font-family: Calibri">MSBuild</span></span><span lang="ZH-CN">项目，因此请确保在</span><span><span style="font-family: Calibri">15.8 Preview 3</span></span><span lang="ZH-CN">或更高版本的<b>最新</b></span><b><span><span style="font-family: Calibri">MSVC</span></span></b><b><span lang="ZH-CN">编译器重新编译项目</span></b><span lang="ZH-CN">。</span></span></li>
 	<li>调试器<strong>加载包含用户代码的二进制文件的</strong><strong>PDB</strong>。</li>
 	<li>在<strong>工具</strong><strong>&gt;选项&gt;调试&gt;常规&gt;启用我的代码</strong>（默认设置）中启用了JMC。</li>
</ul>
<span lang="ZH-CN"><span style="color: #000000">新的“单步执行”行为</span></span>

启用JMC后，调试器将跟踪哪些代码是用户代码或系统/库代码。 当进入具有PDB信息的函数时，执行将继续进行，直到到达另一个标记为用户代码的函数或当前函数完成其执行。 这在实践中意味着，为了获得你的代码，你不必花时间逐行执行你不感兴趣的无数行库代码，更常见的是，你可以停止在你的代码库中遍布大量断点。

例如，在下面的代码片段中，如果没有JMC，如果您有足够的雄心壮志“单步执行”，直到您到达作为参数传递给标准库算法的谓词，您将必须按F11（单步执行）140次！ 使用JMC，它只是一个“单步执行”命令调用。

<span style="color: #000000"><span><span style="font-family: Calibri">STL</span></span><span lang="ZH-CN">算法</span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-stl-before-2.gif"></a><a href="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-stl-before-2.gif"><img width="366" height="244" class="alignleft wp-image-6395 " alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-stl-before-2.gif" /></a><a href="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-stl-after-3.gif"></a><a href="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-stl-after-3.gif"><img width="346" height="229" class="wp-image-6435 alignnone" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-stl-after-3.gif" /></a><a href="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-stl-before-2.gif"></a>

<span style="color: #000000"><span lang="ZH-CN">另一个例子是进入</span><span><span style="font-family: Calibri">Win32 API</span></span><span lang="ZH-CN">回调。</span><span lang="ZH-CN"><span style="font-family: Calibri"> </span></span><span lang="ZH-CN">如果没有</span><span><span style="font-family: Calibri">JMC</span></span><span lang="ZH-CN">，调试器无法判断某些用户代码最终会执行，因此它会完全跳过</span><span><span style="font-family: Calibri">Win32 API</span></span><span lang="ZH-CN">调用而不会进入用户定义的回调。</span><span><span style="font-family: Calibri"> JMC</span></span><span lang="ZH-CN">正确地将回调标识为用户代码并适当地停止调试器。</span></span>

<span style="color: #000000"><span><span style="font-family: Calibri">Win32 API</span></span><span lang="ZH-CN">回调</span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-winsdk-before-2.gif"><img width="338" height="251" class="alignnone wp-image-6485" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-winsdk-before-2.gif" /></a><a href="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-winsdk-after-2.gif"><img width="342" height="251" class="alignnone wp-image-6495" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-winsdk-after-2.gif" /></a><a href="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-winsdk-before-2.gif"></a>

单步执行到特定处

要明确地进入可能是非用户代码的调用，您可以利用编辑器上下文菜单中提供的”单步执行到特定处<strong>”</strong><span>命令。</span> 这允许您选择要进入的特定功能（用户代码与否）：

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/step-into-specific.png"><img width="712" height="371" class="alignnone wp-image-6515" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/step-into-specific.png" /></a>

为其他第三方库配置仅我的代码

C ++调试器认为非用户代码的默认模块和源文件集在％VSInstallDir％\ Common7 \ Packages \ Debugger \ Visualizers下的default.natjmc文件中编码，它指定WinSDK，CRT，STL和ATL / MFC等 其他事情

<span lang="ZH-CN"><span style="color: #000000">您可以通过以下任一方式自定义这组模块和源文件：</span></span>
<ul>
 	<li>修改％VSInstallDir％\ Common7 \ Packages \ Debugger \ Visualizers \ default.natjmc中的中央列表或</li>
 	<li>在％USERPROFILE％\ Documents \ Visual Studio 2017 \ Visualizers文件夹下创建任意数量的用户特定的.natjmc文件</li>
</ul>
<span style="color: #000000"><span lang="ZH-CN">例如，要将所有</span><span><span style="font-family: Calibri">Boost</span></span><span lang="ZH-CN">库视为非用户代码，您可以使用以下内容在上述文件夹中创建</span><span><span style="font-family: Calibri">boost.natjmc</span></span><span lang="ZH-CN">。</span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/Capture1.png"><img width="379" height="92" class="alignnone size-full wp-image-6525" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/Capture1.png" /></a>

您无需重建用户代码即可启动这些更改。在下一个调试会话中，单步执行使用Boost的代码将跳过Boost库代码，并且只有在调用栈上找到某些用户代码时才会停止执行。

有关.natjmc文件格式的更多详细信息，请参阅<a href="https://docs.microsoft.com/en-us/visualstudio/debugger/just-my-code#BKMK_CPP_Customize_call_stack_behavior">仅我的代码文档页面</a>。 请注意，.natjmc格式还支持基于函数名称将代码标记为非用户代码，但出于提高性能原因，我们不建议将此功能用于经常调用的函数或用于大型函数组的函数（'函数'规则 比“模块”或“文件”规则慢得多）

<span lang="ZH-CN"><span style="color: #000000">第三方库</span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-boost-2.gif"><img width="718" height="553" class="alignnone wp-image-6535" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/jmc-boost-2.gif" /></a>

隐藏

<span style="color: #000000"><span lang="ZH-CN">如上所述，</span><span><span style="font-family: Calibri">JMC</span></span><span lang="ZH-CN">功能仅适用于使用新</span><span><span style="font-family: Calibri">MSVC</span></span><span lang="ZH-CN">编译器开关</span><span><span style="font-family: Calibri">/ JMC</span></span><span lang="ZH-CN">编译的用户代码。</span><span lang="ZH-CN"><span style="font-family: Calibri"> </span></span><span lang="ZH-CN">默认情况下，此新开关已在调试配置中用于</span><span><span style="font-family: Calibri">MSBuild</span></span><span lang="ZH-CN">项目。</span><span lang="ZH-CN"><span style="font-family: Calibri"> </span></span><span lang="ZH-CN">如果您使用的是其他构建系统，则需要确保手动将默认的</span><span><span style="font-family: Calibri">/ JMC</span></span><span lang="ZH-CN">开关添加到项目的调试版本中。</span></span>

<span style="color: #000000"><span><span style="font-family: Calibri">/ JMC</span></span><span lang="ZH-CN">仅支持链接到</span><span><span style="font-family: Calibri">CRT</span></span><span lang="ZH-CN">的二进制文件。</span></span>

<span style="color: #000000"><span lang="ZH-CN">要显式关闭</span><span><span style="font-family: Calibri">JMC</span></span><span lang="ZH-CN">，可以使用</span><span><span style="font-family: Calibri">/ JMC-</span></span><span lang="ZH-CN">开关。</span></span>

给我们您的反馈！

<span lang="ZH-CN"><span style="color: #000000">此版本是第一个支持逐步执行仅我的代码</span></span><span><a href="https://www.visualstudio.com/vs/preview/">Visual Studio 2017<span lang="ZH-CN">预览版</span></a></span><span style="color: #000000"><span lang="ZH-CN">。您的反馈是确保我们提供愉快的调试体验的关键部分。</span><span lang="ZH-CN"><span style="font-family: Calibri"> </span></span><span lang="ZH-CN">如有任何问题，请通过</span></span><span><a href="https://twitter.com/visualc">@visualc</a></span><span style="color: #000000"><span lang="ZH-CN">上的</span><span><span style="font-family: Calibri">Twitter</span></span><span lang="ZH-CN">或发送电子邮件至</span><span><span style="font-family: Calibri">visualcpp@microsoft.com</span></span><span lang="ZH-CN">与我们联系。</span><span lang="ZH-CN"><span style="font-family: Calibri"> </span></span><span lang="ZH-CN">如有任何问题或建议，请通过帮助</span><span><span style="font-family: Calibri">&gt;</span></span><span lang="ZH-CN">发送反馈</span><span><span style="font-family: Calibri">&gt;</span></span><span lang="ZH-CN">在</span><span><span style="font-family: Calibri">IDE</span></span><span lang="ZH-CN">中</span></span><span><a href="https://docs.microsoft.com/en-us/visualstudio/ide/how-to-report-a-problem-with-visual-studio-2017"><span lang="ZH-CN">报告问题</span></a></span><span lang="ZH-CN"><span style="color: #000000">告诉我们。</span></span>]]></content:encoded>
    </item>
    <item>
      <title>Visual Studio中共享的PCH使用示例</title>
      <link>https://docs.microsoft.com/archive/blogs/c/visual-studio%E4%B8%AD%E5%85%B1%E4%BA%AB%E7%9A%84pch%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B</link>
      <pubDate>Wed, 18 Jul 2018 07:54:01 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6335</guid>
      <description><![CDATA[[原文发表地址] Shared PCH usage sample in Visual Studio

[原文作者] EricMittelette

[原文发表时间]...]]></description>
      <content:encoded><![CDATA[[<span>原文发表地址</span>] <span><a href="https://blogs.msdn.microsoft.com/vcblog/2018/07/05/shared-pch-usage-sample-in-visual-studio/">Shared PCH usage sample in Visual Studio</a></span>

[<span>原文作者</span>] <span><a href="https://social.msdn.microsoft.com/profile/EricMittelette">EricMittelette</a></span>

[<span>原文发表时间</span>] 2017/7/5

这篇文章由Olga Arkhipova<span>和</span>Xiang Fan<span>撰写</span>.

通常，Visual Studio<span>解决方案中的多个项目使用相同（或非常相似）的预编译头</span>. <span>由于</span>pch<span>文件通常很大并且构建它们需要花费大量时间，这就导致了一个</span><span><a href="https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/4931119-allow-precompiled-headers-to-be-shared-between-pro">共性的问题</a></span>：几个项目是否可以使用相同的且被构建一次的pch<span>文件？</span>

答案是肯定的，但它需要一些技巧来满足cl<span>的检查，用于构建</span>pch<span>的命令行与使用此</span>pch<span>构建源文件的命令行相同。</span>

这是一个示例解决方案，它有3<span>个项目</span> - <span>一个（</span>SharedPCH<span>）正在构建</span>pch<span>和静态库，另外两个（</span>ConsoleApplication 1<span>和</span>2<span>）正在使用它。您可以在我们的</span><a href="https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/4931119-allow-precompiled-headers-to-be-shared-between-pro">VCSamples GitHub<span>存储库</span></a><span>中找到示例代码源。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/spch11.png"><img width="513" height="977" class="alignnone size-full wp-image-6365" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/spch11.png" /></a>

当ConsoleApplication<span>项目引用</span>SharedPCH<span>项目时，构建将自动链接</span>SharedPCH<span>的静态库，但是也需要改变几个项目属性。</span>
<ol>
 	<li>C / C ++<span>附加包含目录</span> <span>（</span>/ I<span>）应包含共享的</span>stdafx.h<span>目录</span></li>
 	<li>C / C ++<span>预编译头文件输出文件（</span>/ Fp<span>）应设置为共享</span>pch<span>文件（由</span>SharedPCH<span>项目生成）</span></li>
 	<li>如果您的项目使用/ Zi<span>或</span>/ ZI<span>编译（请参阅最后有关这些开关的更多信息），使用共享</span>pch<span>的项目需要将共享</span>pch<span>项目生成的</span>.pdb<span>和</span>.idb<span>文件复制到其特定位置以便 最终的</span>pdb<span>文件包含</span>pch<span>符号。</span></li>
</ol>
由于这些属性需要针对所有项目进行类似的更改，我创建了SharedPCH.props<span>和</span>CustomBuildStep.props<span>文件，并使用</span>Property Manager<span>工具窗口将它们导入到我的项目中。</span>

SharedPch.props<span>帮助＃</span>1<span>和＃</span>2<span>，并在所有项目中导入。</span>CustomBuildStep.props<span>帮助＃</span>3<span>并导入到 重要的</span>pch<span>项目，</span><span>但不导入生产项目。如果您的项目使用</span>/ Z7<span>，则不需要</span>CustomBuildStep.props<span>。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/spch21.png"><img width="513" height="863" class="alignnone size-full wp-image-6375" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/spch21.png" /></a>

在SharedPch.props<span>中，我为共享的</span>pch<span>，</span>pdb<span>和</span>idb<span>文件位置定义了属性：</span>

&nbsp;

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/spch31.png"><img width="1258" height="842" class="alignnone size-full wp-image-6385" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/spch31.png" /></a>

我们希望将所有构建输出都放在一个根文件夹下，与源分开，因此我重新定义了输出和中间目录。这对于使用共享pch<span>不是必需的，因为它只是使实验更容易，因为如果出现问题可以删除一个文件夹。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/spch41.png"><img width="1427" height="898" class="alignnone size-full wp-image-6405" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/spch41.png" /></a>

调整后的C / C ++'<span>附加包含目录</span>' <span>和</span>'<span>预编译头文件输出文件</span>'<span>属性</span><span> </span>：

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/spch51.png"><img width="1319" height="898" class="alignnone size-full wp-image-6425" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/spch51.png" /></a>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/spch61.png"><img width="1319" height="898" class="alignnone size-full wp-image-6445" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/spch61.png" /></a>

在CustomBuildStep.props<span>中，我定义了自定义构建步骤，以便在</span>ClCompile<span>目标之前运行，并复制共享的</span>pch .pdb<span>和</span>.idb<span>文件（如果它们比项目的</span>.pdb<span>和</span>.idb<span>文件更新）。请注意，我们在这里讨论的是编译器中间</span>pdb<span>文件，而不是链接器生成的最终文件。</span>

如果项目中的所有文件都使用了一个pch<span>，那就是我们需要做的全部，因为当</span>pch<span>被更改时，所有其他文件也需要重新编译，所以在构建结束时我们将拥有完整的</span>pdb<span>和</span>idb<span>文件。</span>

如果您的项目使用多个pch<span>或包含完全不使用</span>pch<span>的文件，则需要更改这些文件的</span>pdb<span>文件位置（</span>/ Fd<span>），以便共享</span>pch pdb<span>不会覆盖它。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/spch71.png"><img width="1260" height="842" class="alignnone size-full wp-image-6455" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/spch71.png" /></a>

我使用命令行属性编辑器来定义命令。每个'xcopy'<span>命令应该在它自己的行上：</span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/07/spch81.png"><img width="578" height="584" class="alignnone size-full wp-image-6465" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/07/spch81.png" /></a>

或者，您可以将所有命令放在脚本文件中，并将其指定为命令行。

<strong>背景资料</strong>

<span><a href="https://docs.microsoft.com/en-us/cpp/build/reference/z7-zi-zi-debug-information-format">/ Z7，/ ZI和/ Zi</a></span>编译器标志

当使用/ Z7<span>时，调试信息（主要是类型信息）存储在每个</span>OBJ<span>文件中。这包括头文件中的类型，这意味着在共享头文件中存在大量重复，并且</span>OBJ<span>大小可能很大。</span>

使用/ Zi<span>或</span>/ ZI<span>时，调试信息存储在编译器</span>pdb<span>文件中。在一个项目中，源文件通常使用相同的</span>pdb<span>文件（这由</span>/ <span><a href="https://docs.microsoft.com/en-us/cpp/build/reference/fd-program-database-file-name">Fd</a></span>编译器标志控制，默认值为$<span>（</span>IntDir<span>）</span>vc $<span>（</span>PlatformToolsetVersion<span>）</span>.pdb<span>），因此调试信息在它们之间共享。</span>

/ ZI<span>还将生成一个</span>IDB<span>文件来存储与增量编译相关的信息，以支持编辑和继续。</span>

<strong>编译器</strong><strong>PDB<span>与链接器</span>PDB</strong>

如上所述，编译器PDB<span>由</span>/ Zi<span>或</span>/ ZI<span>生成以存储调试信息。</span>稍后，链接器将通过在链接期间组合来自编译器PDB<span>的信息和其他调试信息来生成链接器</span>PDB.链接器还可以删除未引用的调试信息。链接器PDB<span>的名称由</span>/ PDB<span>链接器标志控制。默认值为</span>$<span>（</span>OutDir<span>）</span>$<span>（</span>TargetName<span>）</span>.pdb<span>。</span>

<strong>给我们您的反馈！</strong><strong> </strong>

您的反馈是确保我们提供有用信息和功能的关键部分。如有任何问题，请通过<span><a href="https://twitter.com/visualc">@visualc</a></span>上的Twitter<span>或发送电子邮件至</span> visualcpp@microsoft.com <span>与我们联系。如有任何问题或建议，请通过帮助</span>&gt;<span>发送反馈</span>&gt;<span>在</span>IDE<span>中</span><span><a href="https://docs.microsoft.com/en-us/visualstudio/ide/how-to-report-a-problem-with-visual-studio-2017">报告问题</a></span>告诉我们。]]></content:encoded>
    </item>
    <item>
      <title>宏转换为Contexpr</title>
      <link>https://docs.microsoft.com/archive/blogs/c/%E5%AE%8F%E8%BD%AC%E6%8D%A2%E4%B8%BAcontexpr</link>
      <pubDate>Mon, 16 Jul 2018 10:23:19 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6325</guid>
      <description><![CDATA[[原文发表地址]Convert Macros to Constexpr

[原文发表作者]Augustin Popa

Visual studio 2017 15.8...]]></description>
      <content:encoded><![CDATA[<span style="font-family: Microsoft YaHei">[原文发表地址]<a href="https://blogs.msdn.microsoft.com/vcblog/2018/06/26/convert-macros-to-constexpr/">Convert Macros to Constexpr</a></span>

<span style="font-family: Microsoft YaHei">[原文发表作者]<a href="https://social.msdn.microsoft.com/profile/Augustin+Popa">Augustin Popa</a></span>

<span style="font-family: Microsoft YaHei;font-size: small">Visual studio 2017 15.8 版本已经在预览阶段可以下载使用了。 今天，Preview 3 的版本已经发布了， 这个版本里我们做了很多功能的提升，来提高开发人员开发体验。 15.8 里面其中一个红药的主题就是代码现在化， 宏是这里面的关键角色。 在15.8 Preview 1， 我们已经可以展开宏的快速信息提示文本，现在，在Preview 3， 我们很高兴的宣布VS可以将他们转化为现代C++ contexpr表达式，并提供可相应的选项来完成这个转换， 这个方式可以帮你清理你的代码，使你的代码更加现代化。这个功能(和通用编辑器其他功能一样) 是可以配置，也可以根据自身的需求打开或者关闭。</span>

<span style="font-family: Microsoft YaHei"><span style="font-size: medium"><b>Macro </b><b>转为常量的快速修改</b></span></span>

<span style="font-family: Microsoft YaHei;font-size: small">当你在编辑器里查看你的代码的时候，你可能会注意到一些”...” 在#define 指令中，某些宏的下面。这些“...” 被称为建议，是另外一种关于错误的单独的分类（红色的曲线；对大多数代码问题）， 和警告(绿色的曲线，一些简单的代码问题)。一个“建议”是涵盖一些低风险的代码问题。</span>

<span style="font-family: Microsoft YaHei;font-size: small"><img src="https://msdnshared.blob.core.windows.net/media/2018/06/110.png" /></span>

<span style="font-family: Microsoft YaHei;font-size: small"><img src="https://msdnshared.blob.core.windows.net/media/2018/06/24.png" /></span>

<span style="font-family: Microsoft YaHei;font-size: small"></span>

<span style="font-family: Microsoft YaHei;font-size: small">当选中这个选项， 一个预览窗口将会出现，展示你将要所做的修改:</span>

<span style="font-family: Microsoft YaHei;font-size: small"><img src="https://msdnshared.blob.core.windows.net/media/2018/06/34.png" /></span>

<span style="font-family: Microsoft YaHei;font-size: small">一旦这个修改被应用， 代码编辑器里就会出现转换为常量的表达式：</span>

<span style="font-family: Microsoft YaHei;font-size: small"><img src="https://msdnshared.blob.core.windows.net/media/2018/06/42.png" /></span>

<span style="font-family: Microsoft YaHei;font-size: small">这个功能对常量有用，对一些基本的表达式，像宏一样的方法也可以应用</span>：

<img src="https://msdnshared.blob.core.windows.net/media/2018/06/51.png" />

<span style="font-family: Microsoft YaHei;font-size: small">你可能会注意到，上面代码里面的“Max” 下面没有’”...”, 对于像宏一样的方法， 我们还没有充分全面的预处理来保证这个转换是可以成功，这是为了保证VS的集成开发环境的稳定性能。 因为我们只想对那些我们认为的合理转换 去显示”建议“的提示。 虽然我们不会显示”...“指示器，然而，你还是可以能够从灯泡菜单项里找到转换的选项， 但你在预览窗口里面选择应用改变的时候然后我们才会在充分处理宏的转换。 这样， 宏就会被转换为下面的模板：</span>

<span style="font-family: Microsoft YaHei;font-size: small"><img width="816" height="62" src="https://msdnshared.blob.core.windows.net/media/2018/06/61.png" /></span>

<span style="font-family: Microsoft YaHei;font-size: small">通常，你是可以选择自己将宏转为contexpr， 但是当你看不到”...”时也不要期待它一直起作用。不是所有的宏都是可以转化为contexpr的， 因为宏的范围很宽泛， 很多宏和contexpr或者contexpr表达式是无关的。</span>

<strong><span style="font-family: Microsoft YaHei;font-size: medium">工具&gt;选项 配置</span></strong>

<span style="font-family: Microsoft YaHei;font-size: small">你可以在工具&gt;选项&gt;文本编辑器&gt;C/C++&gt;查看&gt; 宏转换为常量 里配置。在那里，你可以根据自己的喜好选择是否显示为建议（默认操作），警告（绿色下划线），错误(生成中断，红色曲线)， 或者 无（隐藏文本编辑提示器）。</span>

<img src="https://msdnshared.blob.core.windows.net/media/2018/06/71.png" />

<strong><span style="font-family: Microsoft YaHei;font-size: medium">请给我们反馈!</span></strong>

<span style="font-family: Microsoft YaHei;font-size: small">这是我们第一次发布这个功能， 我们会非常感谢如果你们能在下面给我们留言反馈如何让我们做的更好。 如果你们遇到任何产品问题， 请通过集成开发环境里的“帮助&gt;发送反馈&gt;报告问题 "让我们知道。</span>]]></content:encoded>
    </item>
    <item>
      <title>通过vcpkg和最新的MSVC编译器来使用Boost.Hana</title>
      <link>https://docs.microsoft.com/archive/blogs/c/%E9%80%9A%E8%BF%87vcpkg%E5%92%8C%E6%9C%80%E6%96%B0%E7%9A%84msvc%E7%BC%96%E8%AF%91%E5%99%A8%E6%9D%A5%E4%BD%BF%E7%94%A8boost-hana</link>
      <pubDate>Wed, 11 Jul 2018 10:57:59 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6305</guid>
      <description><![CDATA[[原文发表地址]...]]></description>
      <content:encoded><![CDATA[[原文发表地址] <a href="https://blogs.msdn.microsoft.com/vcblog/2018/06/04/use-boost-hana-via-vcpkg-with-the-latest-msvc-compiler/">https://blogs.msdn.microsoft.com/vcblog/2018/06/04/use-boost-hana-via-vcpkg-with-the-latest-msvc-compiler/</a>

[原文作者] <a href="https://social.msdn.microsoft.com/profile/Bat-Ulzii+Luvsanbat">Bat-Ulzii Luvsanbat</a>

[原文发表时间] 6/4/2018
<h3>概述</h3>
一如既往，我们依旧致力于改善MSVC编译器一致性的工作，我们希望启用更多的C ++库，并且今天我们把Boost.Hana引入了Visual C ++。 基于我们最近的C ++一致性进展，我们在vcpkg版本中应用了一些代码变通方案后，客户现在可以在VS2017 15.7 update中使用Boost.Hana了。 我们要感谢Boost.Hana的作者Louis Dionne与我们一起做出的努力和额外的支持。
<h3>怎么获取它？</h3>
<ul>
 	<li>访问GitHub上的 <a href="https://github.com/Microsoft/vcpkg">vcpkg</a>并阅读README.md中的介绍</li>
 	<li>我们创建了一个新的Hana<a href="https://github.com/xiangfan-ms/hana"><span>分支</span></a>并将vcpkg指向了它</li>
 	<li>在你构建vcpkg后，执行下面的命令来安装Hana:
<ul>
 	<li>vcpkg.exe install boost-hana</li>
 	<li>在Windows上安装Boost的期间，您将看到此免责声明：“当前的MSVC版本无法编译Boost hana。 请使用来自boost 1.67的分支，它上面有替代的变通方案。“</li>
</ul>
</li>
</ul>
<h3>背景</h3>
也许你已经看到了我们发布了一个关于最近的VS2017 update 的博客：<a href="https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/">C++一致性实施</a>。截至2018年6月初，MSVC还一直因为一些bug而不能构建Boost.Hana的master分支。但我们在两年前就已经开始了这项工作，并且已修复了大约40个来自Boost.Hana的编译器bug。我们在constexpr中遇到了一些阻塞问题，因此我们暂时停止了这项工作，直到最近VS2017 15.7发布，我们在C ++ 14和C ++ 17 constexpr的一致性方面取得了足够的进展。

最近我们重新审视了这个工作的状态，大部分的constexpr阻塞问题已经在VS2017 15.7 update上修复了。然而编译器中的多个功能区域仍然存在未解决的问题，导致我们无法构建Boost.Hana。

虽然编译器仍有工作要做，但由于我们客户对此库的需求很大，所以我们在Boost.Hana中为剩余的编译器bug做了代码上的变通方案。 这是有必要的，因此我们可以对所有已知问题进行完整的测试。 我们现在已经将Boost.Hana的构建加入到了我们的日常测试中，以此来保证我们在开发编译器时没有引出回归问题，同时我们逐步实现与公共资源库的一对一奇偶校验。

在与Louis讨论这个问题后，我们一致同意在vcpkg中提供一个新的Boost.Hana版本来促进更多的Visual C ++社区用户使用该库。 新版本中包含我们之前确定的补丁，并且当我们修复剩余的bug时，我们将逐步更新vcpkg中的Boost.Hana版本，最终在bug修复后我们将删除它并将其替换为master。现在我想我们已经非常接近这个目标了，我们可以在vcpkg中包含当前的这些进展， 而不会影响依赖此库的新用户。

再次感谢Louis愿意接受关于<a href="https://github.com/boostorg/hana/issues">Hana bug</a>的报告并迅速解决它们，这大大加快了我们的进展。
<h3>代码变通方案</h3>
<ul>
 	<li>MSVC<span>特定的代码变通方案有</span>70<span>处</span>: 27<span>处在库文件本身，</span>20<span>处在测试用例，</span>23<span>处在示例。</span></li>
 	<li>这些变通方案都在独特的宏定义下，前缀为“BOOST_HANA_WORKAROUND_MSVC_”<span>，并且每个问题都有来自我们内部数据库特定的</span>bug ID<span>。更多详细信息见</span><a href="https://github.com/xiangfan-ms/hana/blob/master/include/boost/hana/config.hpp">这里</a>。</li>
 	<li>下面是一些示例：</li>
</ul>
<img src="https://msdnshared.blob.core.windows.net/media/2018/06/Hana-source-changes.png" />
<h3>编译bug</h3>
<ul>
 	<li>VS2017 15.7 update<span>里面还有</span>25<span>个活跃的</span>bug<span>。</span></li>
 	<li>我们计划在VS2017 15.9 update<span>中修复它们。</span></li>
</ul>
<img src="https://msdnshared.blob.core.windows.net/media/2018/06/Hana-bugs.png" />
<h3>下一步…</h3>
<ul>
 	<li>在接下来的VS2017 update<span>中，我们将完全修复阻塞</span>Hana<span>库的上游版本的剩余</span>MSVC bug<span>。 在我们修复错误时，我们也将逐步更新相应的代码变通方案。</span></li>
 	<li>我们将继续提供有关我们进展的最新状态。</li>
 	<li>我们将确保在vcpkg<span>中依赖此库的用户不会受到我们工作的影响。</span></li>
 	<li>Range-v3<span>的进展如何？</span>
<ul>
 	<li>同样，我们正在跟踪编译器中的所有Range-v3 bug<span>，并计划在接下来的</span>Visual Studio 2017update<span>中修复它们。</span></li>
</ul>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Visual Studio中的CMake支持 - 配置模板</title>
      <link>https://docs.microsoft.com/archive/blogs/c/visual-studio%E4%B8%AD%E7%9A%84cmake%E6%94%AF%E6%8C%81-%E9%85%8D%E7%BD%AE%E6%A8%A1%E6%9D%BF</link>
      <pubDate>Wed, 11 Jul 2018 09:23:01 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6295</guid>
      <description><![CDATA[[原文发表地址] CMake Support in Visual Studio – Configuration Templates 

[原文发表时间] 2018/06/27

Visual...]]></description>
      <content:encoded><![CDATA[<span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">[<span lang="ZH-CN">原文发表地址</span>] </span><a href="https://blogs.msdn.microsoft.com/vcblog/2018/06/27/cmake-support-in-visual-studio-configuration-templates/">CMake Support in Visual Studio – Configuration Templates</a><span style="color: #000000"> </span></span>

<span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">[<span lang="ZH-CN">原文发表时间</span>] 2018/06/27</span></span>

<span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><a href="https://visualstudio.microsoft.com/vs/preview/">Visual Studio 2017 15.8<span lang="ZH-CN">预览版</span>3</a><span style="color: #000000"><span lang="ZH-CN">现已推出，它包含对</span>CMake<span lang="ZH-CN">工具的一些改进。除了一些修复，我们还通过添加配置模板的方法简化了</span>CMakeSettings.json<span lang="ZH-CN">配置文件。</span></span></span>
<div class="site-content" id="content">
<div class="content-area" id="primary"><article class="post-19605 post type-post status-publish format-standard hentry category-cmake tag-announcement tag-c tag-cmake tag-cross-platform-2 tag-ide tag-openfolder" id="post-19605">
<div class="entry-content">

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">如果你是</span></span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">Visual Studio<span lang="ZH-CN">中的</span>CMake<span lang="ZH-CN">新成员，请查看</span></span><a href="https://blogs.msdn.microsoft.com/vcblog/2016/10/05/cmake-support-in-visual-studio/"><span lang="ZH-CN">如何开始使用</span></a><span lang="ZH-CN"><span style="color: #000000">。</span></span></span>

<span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 14pt"><span style="color: #000000">CMake<span lang="ZH-CN">的配置模板</span></span></span>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">如果之前你曾创建过一个</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">CMakeSettings.json<span lang="ZH-CN">文件来自定义项目的设置，那么你可能知道该文件可能有点令人畏惧。</span>Desktop<span lang="ZH-CN">和</span>Linux<span lang="ZH-CN">工作负载都安装后，默认的</span>CMakeSettings.json<span lang="ZH-CN">文件超过</span>100<span lang="ZH-CN">行。我们从社区收到反馈意见，该文件难以解压缩和理解，因此我们简化了填充默认</span>CMakeSettings.json<span lang="ZH-CN">文件的方式。我们还提供了一种直接通过配置选择器访问和编辑此配置文件的方法。</span></span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 14pt"><span style="color: #000000">开始</span></span>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">当你第一次打开</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">CMake<span lang="ZH-CN">文件夹时，我们现在会默认创建一个与当前操作系统匹配的调试配置。这样，你仍然可以启动并运行以定位本地计算机，而无需创建</span>CMakeSettings.json<span lang="ZH-CN">文件。但是，一旦你想要添加或自定义</span>CMake<span lang="ZH-CN">配置列表，就可以比以往更轻松地执行此操作：</span></span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/06/Create-CMakeSettings-from-Config-Dropdown.png"><img width="405" height="85" class="size-full wp-image-19615 aligncenter" alt="Create CMakeSettings from Config Dropdown" src="https://msdnshared.blob.core.windows.net/media/2018/06/Create-CMakeSettings-from-Config-Dropdown.png" /></a>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">单击配置选择下拉列表（</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">F5<span lang="ZH-CN">按钮右侧）中的“管理配置</span>...<span lang="ZH-CN">”将要求你选择你希望调试项目的模板。</span> Visual Studio<span lang="ZH-CN">会将所选模板添加到在根</span>CMakeLists<span lang="ZH-CN">文件的文件夹中新创建的</span>CMakeSettings.json<span lang="ZH-CN">中。</span></span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/06/Configuration-Template-Selector.png"><img width="436" height="538" class="size-full wp-image-19625 aligncenter" alt="Configuration Template Selector" src="https://msdnshared.blob.core.windows.net/media/2018/06/Configuration-Template-Selector.png" /></a>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">这包含我们之前支持的所有配置以及添加了一些用于定位</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">MinGW<span lang="ZH-CN">和</span>ARM IoT<span lang="ZH-CN">设备的新配置。一旦你选择模板后，它将会添加到你的</span>CMakeSettings.json<span lang="ZH-CN">文件中。例如我们以“</span>x86-Debug<span lang="ZH-CN">”为例，我们看到它会产生一个非常简短紧凑的</span>CMakeSettings.json<span lang="ZH-CN">文件：</span></span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/06/Nice-and-Short-CMakeSettings.png"><img width="782" height="349" class="size-full wp-image-19635 aligncenter" alt="New CMakeSettings.json Content" src="https://msdnshared.blob.core.windows.net/media/2018/06/Nice-and-Short-CMakeSettings.png" /></a>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">只有</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">17<span lang="ZH-CN">行，这比过去的文件更易于管理。</span></span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 14pt"><span style="color: #000000">添加新配置</span></span>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">一旦你创建此文件后，再次点击“管理配置</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">...<span lang="ZH-CN">”按钮将返回</span>CMakeSettings.json<span lang="ZH-CN">文件。但是，这并不意味着你无法向其添加更多模板。想要在创建文件后添加新模板，只需右键单击编辑器上的任意位置，然后选择添加配置：</span></span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/06/CMakeSettings-Editor-Add-Configuration.png"><img width="453" height="300" class="size-full wp-image-19645 aligncenter" alt="Add a Configuration from the Editor" src="https://msdnshared.blob.core.windows.net/media/2018/06/CMakeSettings-Editor-Add-Configuration.png" /></a>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">或者，你可以在解决方案资源管理器中右键单击</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">CMakeSettings.json<span lang="ZH-CN">文件：</span></span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/06/Add-Configuration-from-Solution-Explorer.png"><img width="376" height="398" class="size-full wp-image-19655 aligncenter" alt="Add Configuration from the Solution Explorer" src="https://msdnshared.blob.core.windows.net/media/2018/06/Add-Configuration-from-Solution-Explorer.png" /></a>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">新选择的模板将被添加到配置文件的末尾。</span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 14pt"><span style="color: #000000">自定义配置模板（实验）</span></span>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">除了内置的配置模板，我们还为你添加了一种实验方法来创建自己的模板。在工具</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">&gt;<span lang="ZH-CN">选项</span>&gt; CMake<span lang="ZH-CN">下，现在有一个“</span>CMakeSettings.json<span lang="ZH-CN">模板目录”条目：</span></span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/06/Custom-Configuraiton-Templates.png"><img width="744" height="484" class="size-full wp-image-19665 aligncenter" alt="Custom Templates in Tools &gt; Options &gt; CMake" src="https://msdnshared.blob.core.windows.net/media/2018/06/Custom-Configuraiton-Templates.png" /></a>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">你可以将此指向包含一个或多个包含</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">CMake<span lang="ZH-CN">自定义模板的</span>JSON<span lang="ZH-CN">文件的目录。这些文件可以具有任何名称，并且基本上具有与标准</span>CMakeSettings.json<span lang="ZH-CN">文件相同的格式。 “配置”数组将被视为模板，并将显示在模板选择器中。要在模板扇区中设置其描述，只需在配置的</span>JSON<span lang="ZH-CN">中添加“描述”字段即可。</span></span></span>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">我们很想知道你如何使用它，以及它是否适合你。你的反馈将帮助我们在</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">Visual Studio<span lang="ZH-CN">的未来版本中塑造此功能。</span></span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 14pt"><span style="color: #000000">社区报告的问题和其他改进</span></span>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">我们在最新的</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">Visual Studio Preview<span lang="ZH-CN">中修复了一些客户报告的问题，包括与我们的</span>IDE<span lang="ZH-CN">与</span>CTest<span lang="ZH-CN">集成相关的几个问题：</span></span></span>
<ul type="disc">
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/243316/cmake-configuration-fails.html">CMake<span>配置因输出窗口中的堆栈跟踪而失败</span></a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/224238/cmake-vcpkg-problem-parameter-name-file-actual-val.html">CMake + vcpkg<span>问题</span></a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/240025/vs2017-test-explorer-and-ctest-run-from-different.html"><span>测试资源管理器和</span>CTest<span>从不同的目录运行</span></a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/98182/c-quick-actions-create-definition-for-a-member-fun-1.html">C ++<span>快速操作成员函数的创建定义返回未知错误</span></a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/210188/cmake-tests-environment-variables-ignored.html">CMake +<span>测试：忽略环境变量</span></a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/218057/cmake-tests-not-being-detected-in-156.html"><span lang="ZH-CN">未在</span>15.6<span lang="ZH-CN">中检测到</span>CMake<span lang="ZH-CN">测试</span></a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/228522/cmake-test-explorer-doesnt-escape-arguments-like-c.html">CMake<span>：测试资源管理器不会像</span>CTest<span>那样逃避参数</span></a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/230166/cmake-support-does-not-work.html">CMake<span>缓存生成卡在</span>Catch2<span>存储库中</span></a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/234282/test-explorer-does-not-properly-interpret-ctest-te.html"><span>测试资源管理器无法正确解释将</span>WILL_FAIL<span>属性设置为</span>TRUE<span>的</span>CTest<span>测试</span></a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/245822/cmake-view-all-built-tests-does-not-display-all-ct.html">CMake<span>查看所有构建的测试不显示所有</span>CTests</a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/246360/cmake-running-static-code-analysis-fails-to-detect.html">CMake<span>：运行静态代码分析无法检测到</span>c ++ 17</a></li>
 	<li><a href="https://developercommunity.visualstudio.com/content/problem/254351/visual-studio-build-tools-2017-1571-missing-visual.html">Visual Studio Build Tools 2017<span>（</span>15.7.1<span>）缺少用于</span>CMake<span>的</span>Visual C ++<span>工具</span></a></li>
</ul>
<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">除了社区报告的问题之外，我们还解决了以下客户影响问题：</span></span>
<ul type="disc">
 	<li><span>关闭某些CMake项目时的长时间延迟</span></li>
 	<li><span>在不关闭之前打开的项目的情况下打开新的CMake项目不再锁定IDE</span></li>
 	<li><span>如果在“.vscode \ settings.json”中定义了过滤器，则CMake项目扫描不再永远等待</span></li>
 	<li><span>C＃CMake项目现在默认为Visual Studio生成器，F5启动托管/混合调试器（实验）</span></li>
</ul>
<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">再次感谢所有报道这些问题的人！</span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">除了对</span></span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">CMakeSettings<span lang="ZH-CN">和配置的更改之外，最新版本的</span>CMake<span lang="ZH-CN">工具还包括改进的</span></span><a href="https://blogs.msdn.microsoft.com/vcblog/2018/04/09/cmake-support-in-visual-studio-targets-view-single-file-compilation-and-cache-generation-settings/"><span lang="ZH-CN">单文件编译</span></a><span lang="ZH-CN"><span style="color: #000000">。所有错误和警告现在都出现在错误列表中，而不是仅显示在输出窗口中。</span></span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 14pt"><span style="color: #000000">向我们发送反馈</span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">你的反馈是确保我们能够提供最佳</span></span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">CMake<span lang="ZH-CN">体验的关键部分。我们很想知道</span></span><a href="https://www.visualstudio.com/vs/preview/">Visual Studio 2017 Preview</a><span style="color: #000000"><span lang="ZH-CN">如何为你工作。如果你有任何特定于</span>CMake Tools<span lang="ZH-CN">的反馈，请联系</span></span><a href="mailto:cmake@microsoft.com">cmake@microsoft.com</a><span lang="ZH-CN"><span style="color: #000000">。对于一般问题，请</span></span><a href="https://docs.microsoft.com/en-us/visualstudio/ide/how-to-report-a-problem-with-visual-studio-2017"><span lang="ZH-CN">报告问题</span></a><span lang="ZH-CN"><span style="color: #000000">。</span></span></span>

</div>
</article></div>
</div>
<div class="entry-content"><article class="post-19605 post type-post status-publish format-standard hentry category-cmake tag-announcement tag-c tag-cmake tag-cross-platform-2 tag-ide tag-openfolder" id="post-19605">
<div class="content-area" id="primary"></div>
</article></div>
<div class="site-content" id="content">
<div class="entry-content"><article class="post-19605 post type-post status-publish format-standard hentry category-cmake tag-announcement tag-c tag-cmake tag-cross-platform-2 tag-ide tag-openfolder" id="post-19605"></article></div>
<div class="content-area" id="primary">
<div class="entry-content"></div>
<article class="post-19605 post type-post status-publish format-standard hentry category-cmake tag-announcement tag-c tag-cmake tag-cross-platform-2 tag-ide tag-openfolder" id="post-19605">&nbsp;
<div class="entry-content">

<span></span>

</div>
</article></div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>MSVC编译器预处理程序迈向标准化</title>
      <link>https://docs.microsoft.com/archive/blogs/c/msvc%E7%BC%96%E8%AF%91%E5%99%A8%E9%A2%84%E5%A4%84%E7%90%86%E7%A8%8B%E5%BA%8F%E8%BF%88%E5%90%91%E6%A0%87%E5%87%86%E5%8C%96</link>
      <pubDate>Wed, 11 Jul 2018 07:57:34 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6265</guid>
      <description><![CDATA[[原文发表地址] MSVC Preprocessor Progress towards Conformance

[原文发表时间]...]]></description>
      <content:encoded><![CDATA[<header class="entry-header single">

<hr />

</header>
<div class="entry-content single">

<span>[<span lang="ZH-CN">原文发表地址</span>] </span><a href="https://blogs.msdn.microsoft.com/vcblog/2018/07/06/msvc-preprocessor-progress-towards-conformance/">MSVC Preprocessor Progress towards Conformance</a>

<span>[<span lang="ZH-CN">原文发表时间</span>] 2018/07/06</span>
<h1 style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 11.0pt"><strong>为什么重写编译器预处理程序</strong></h1>
&nbsp;
<p style="margin: 0in;font-size: 11.0pt"><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">最近我们发布了一篇关于</span><span style="font-family: Calibri" lang="en-US">C++</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">标准完成度的<a href="https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/">一篇博客</a>。</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">博客中提到，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> MSVC</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">预处理程序正在进行大改动</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">. </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">这样做的目的旨在提高编译器的语言标准，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">解决一些因框架设计导致修复困难的一些久远的</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">bug</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">并提高可用性与诊断性。</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">除此之外，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> C++</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">标准在某些预处理行为上并没有指定定义，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">而且我们的传统行为与其他主要编译器有所不同。在这种情况下，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">我们尽可能亲和当前的体系结构并使交互平台的一些库更加方便的支持</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">MSVC</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">。</span></p>
&nbsp;
<p style="margin: 0in;font-size: 11.0pt"><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">如果你使用了一个依赖</span><span style="font-family: Calibri" lang="en-US">MSVC</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">预处理程序的非标准传统行为的库，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">你大可不用担心兼容性。更新后的预处理程序工作在</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">/experimental:preprocessor</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">开关下</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">, </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">当完全实现时它将会转为</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">/permissive-</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">模式下一个含有</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">/Zc:</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">的默认开启开关。</span></p>
&nbsp;
<h1 style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 11.0pt"><strong>我如何去使用</strong></h1>
&nbsp;
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="zh-CN">维护传统预处理程序的行为并继续作为编译器的默认行为。</span><span lang="en-US"> </span><span lang="zh-CN">从</span><a href="https://blogs.msdn.microsoft.com/visualstudio/2018/06/26/visual-studio-2017-version-15-8-preview-3"><span lang="en-US">VS2017 Preview 3 release</span></a><span lang="zh-CN">开启命令提示框，</span><span lang="en-US"> </span><span lang="zh-CN">使用</span><span lang="en-US">/experimental:preprocessor</span><span lang="zh-CN">选项开启标准化的预处理程序。</span></p>
&nbsp;
<p style="margin: 0in;font-size: 11.0pt"><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">我们已经介绍了一个新的预定义宏</span><span style="font-family: Calibri" lang="en-US">"_MSVC_TRADITIONAL", </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">它可以用来标识正在被使用的传统预处理程序。这个宏不需要任何条件，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">只依赖于正在使用的预处理程序。</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">宏返回</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">1</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">代表传统预处理程序，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> 0</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">代表使用新的标准化的体验版预处理程序</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">.</span></p>
&nbsp;
<p style="margin: 0in;font-family: Consolas;font-size: 9.5pt"><span style="color: gray">#if defined</span><span style="color: black">(_MSVC_TRADITIONAL) &amp;&amp; _MSVC_TRADITIONAL</span></p>
<p style="margin: 0in;font-family: Consolas;font-size: 9.5pt;color: green">// Logic using the traditional preprocessor</p>
<p style="margin: 0in;font-family: Consolas;font-size: 9.5pt;color: gray">#else</p>
<p style="margin: 0in;font-family: Consolas;font-size: 9.5pt;color: green">// Logic using cross-platform compatible preprocessor</p>
<p style="margin-top: 0pt;margin-bottom: 8pt;font-family: Consolas;font-size: 9.5pt;color: gray">#endif</p>
<a href="https://msdnshared.blob.core.windows.net/media/2018/07/070618_2031_MSVCPreproc11.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/07/070618_2031_MSVCPreproc11.png" alt="" width="761" height="370" class="alignnone size-full wp-image-6275" /></a>
<h1 style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 11.0pt"><strong>新的变动</strong></h1>
&nbsp;
<p style="margin: 0in;font-size: 11.0pt"><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">第一个发布的实验预处理程序主要致力完成对</span><span style="font-family: Calibri" lang="en-US">C++</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">标准支持相关的宏，使</span><span style="font-family: Calibri" lang="en-US">MSVC</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">编译器可以最大化支持各种最新库。由于使用已更新的预处理程序，在测试实际产品项目中出现了一些不兼容，我们需要进行重新修改，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">下面列出一些常见的修改方案.</span></p>

<h2><span>行为</span><span>1  </span><span>宏注释</span></h2>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="zh-CN">传统的预处理程序基于字符串缓冲区而不是预处理单词。</span><span lang="en-US"> </span><span lang="zh-CN">下面的代码通过宏注释的技巧将不会在更新后的标准化预处理程序中工作.</span></p>

</div>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="color: #7f7f7f;background: white">#if</span><span style="color: black;background: white"> DISAPPEAR</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="background: white">#define DISAPPEARING_TYPE /##/</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="background: white">#else</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="background: white">#define</span><span style="color: #b00000;background: white"> </span><span style="color: #6f008a;background: white">DISAPPEARING_TYPE</span><span style="color: #b00000;background: white"> </span><span style="color: blue;background: white">int</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="background: white">#endif</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt;color: green"><span style="background: white" lang="en-US">//</span><span style="background: white" lang="zh-CN">当</span><span style="background: white" lang="en-US">DISAPPEARING_TYPE</span><span style="background: white" lang="zh-CN">变成注释时</span><span style="background: white" lang="en-US">myVal</span><span style="background: white" lang="zh-CN">会被注释掉</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt;color: green"><span style="background: white" lang="en-US">//</span><span style="background: white" lang="zh-CN">为了符合标准，使用</span><span style="background: white" lang="en-US">//</span><span style="background: white" lang="zh-CN">将随后的代码包含</span><span style="background: white" lang="en-US">// #if /#endif</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="background: white">DISAPPEARING_TYPE myVal;</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt;color: green"><span style="background: white" lang="en-US">
</span></p>

<h2 style="margin: 0in;font-size: 11.0pt"><strong><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">行为</span><span style="font-family: Calibri" lang="en-US">2 [L#</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">val</span><span style="font-family: Calibri" lang="en-US">]</span></strong></h2>
&nbsp;
<p style="margin: 0in;font-size: 11.0pt"><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">传统的预处理程序将字符串前缀的合并不正确的处理为</span><span style="font-family: Calibri" lang="en-US">#</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">操作符</span></p>
<p style="margin: 0in"><span style="font-family: 'Times New Roman';font-size: 10.5pt;color: #454545;background: white" lang="en-US"> </span><span style="font-family: Consolas;font-size: 9.0pt;color: #7f7f7f;background: white" lang="x-none">#define</span><span style="font-family: Consolas;font-size: 9.0pt;color: #b00000;background: white" lang="x-none"> </span><span style="font-family: Consolas;font-size: 9.0pt;color: #6f008a;background: white" lang="x-none">DEBUG_INFO</span><span style="font-family: Consolas;font-size: 9.0pt;color: black;background: white" lang="x-none">(val) </span><span style="font-family: Consolas;font-size: 9.0pt;color: #a31515;background: white" lang="x-none">L”debug prefix:”</span><span style="font-family: Consolas;font-size: 9.0pt;color: black;background: white" lang="x-none"> L#val</span></p>
<p style="margin: 0in;font-family: Consolas;font-size: 9.0pt;color: green"><span style="background: white">//                                       ^</span></p>
<p style="margin: 0in;font-family: Consolas;font-size: 9.0pt;color: green"><span style="background: white">//                                       this prefix</span></p>
<p style="margin: 0in;font-size: 11.0pt"><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">这个例子中</span><span style="font-family: Calibri" lang="en-US">L</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">前缀没有必要，</span><span style="font-family: 'Microsoft YaHei'" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">因为临近的字符串字面值在宏展开后总是会合并</span><span style="font-family: 'Microsoft YaHei'" lang="en-US">. </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">向后兼容的修复是改变宏定义为</span></p>
<p style="margin: 0in;font-family: Consolas;font-size: 9.0pt"><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #7f7f7f;background: white" lang="x-none"> </span><span style="color: #6f008a;background: white" lang="x-none">DEBUG_INFO</span><span style="color: black;background: white" lang="x-none">(val) </span><span style="color: #a31515;background: white" lang="x-none">L”debug prefix:”</span><span style="color: black;background: white" lang="x-none"> #val</span></p>
<p style="margin: 0in;font-family: Consolas;font-size: 9.0pt;color: green"><span style="background: white">//                                       ^</span></p>
<p style="margin: 0in;font-family: Consolas;font-size: 9.0pt;color: green"><span style="background: white">//                                       no prefix</span></p>
<p style="margin: 0in;font-size: 11.0pt"><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">这个问题也出现在在字符化参数转换为宽字符串的转换宏上</span><span style="font-family: Calibri" lang="en-US">.</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 9.0pt;color: green"><span style="background: white" lang="x-none">//</span><span style="background: white" lang="zh-CN">传统的预处理程序创建一个单独的宽字符串字面值词法
</span><span style="font-family: Consolas;color: #7f7f7f;background: white" lang="en-US">#define</span><span style="font-family: Georgia;color: #001000;background: white" lang="x-none"> </span><span style="font-family: Georgia;color: #6f008a;background: white" lang="x-none">STRING</span><span style="font-family: Georgia;color: black;background: white" lang="x-none">(str) L#str
</span><span style="font-family: Consolas;background: white" lang="en-US">// </span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">潜在的修复</span><span style="font-family: Consolas;background: white" lang="en-US">:
</span><span style="font-family: Consolas;background: white" lang="en-US">// </span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">使用</span><span style="font-family: Consolas;background: white" lang="en-US">L""</span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">和</span><span style="font-family: Consolas;background: white" lang="en-US">#str</span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">字符串连接符
</span><span style="font-family: Consolas;background: white" lang="en-US">// </span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">它可以正常工作，因为临近字符串字面值在宏展开后合并
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="x-none"> </span><span style="color: #6f008a;background: white" lang="x-none">STRING1</span><span style="color: black;background: white" lang="x-none">(str) </span><span style="color: #a31515;background: white" lang="x-none">L””</span><span style="color: black;background: white" lang="x-none">#str
</span><span style="font-family: Consolas;background: white" lang="en-US">// </span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">在</span><span style="font-family: Consolas;background: white" lang="en-US">#</span><span style="font-family: 'Microsoft YaHei';background: white" lang="en-US">str</span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">增一个前缀通过额外的宏展开式形成字符串
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="x-none"> </span><span style="color: #6f008a;background: white" lang="x-none">WIDE</span><span style="color: black;background: white" lang="x-none">(str) L##str
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="x-none"> </span><span style="color: #6f008a;background: white" lang="x-none">STRING2</span><span style="color: black;background: white" lang="x-none">(str) </span><span style="color: #6f008a;background: white" lang="x-none">WIDE</span><span style="color: black;background: white" lang="x-none">(#str)
</span><span style="font-family: Consolas;background: white" lang="en-US">// </span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">使用多个</span><span style="font-family: Consolas;background: white" lang="en-US">#</span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">操作符合并单元
</span><span style="font-family: Consolas;background: white" lang="en-US">// ##</span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">，</span><span style="font-family: Consolas;background: white" lang="en-US">#</span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">操作符的顺序在所有编译器都是未指定的
</span><span style="font-family: Consolas;background: white" lang="en-US">// </span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">在这个例子中检查</span><span style="font-family: Consolas;background: white" lang="en-US">##</span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">前的</span><span style="font-family: Consolas;background: white" lang="en-US">#</span><span style="font-family: 'Microsoft YaHei';background: white" lang="zh-CN">操作符
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="x-none"> </span><span style="color: #6f008a;background: white" lang="x-none">STRING3</span><span style="color: black;background: white" lang="x-none">(str) L## #str</span></p>

<h2 style="margin: 0in;font-size: 11.0pt"><strong><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">行为</span><span style="font-family: Calibri" lang="en-US">3 </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">无效的</span><span style="font-family: Calibri" lang="en-US">##</span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">警告</span></strong></h2>
&nbsp;
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="zh-CN">当</span><span lang="en-US">##</span><span lang="zh-CN">操作符无法形成一个单独的有效的预处理单元时，</span><span lang="en-US"> </span><span lang="zh-CN">即为未定义行为。传统的预处理程序无法继续合并标记。新的预处理程序将会与其他主要编译器行为保持一致并给出诊断</span><span lang="en-US">.</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 9.0pt;color: green"><span style="background: white" lang="en-US">//##</span><span style="background: white" lang="zh-CN">是不必要的，</span><span style="background: white" lang="en-US"> </span><span style="background: white" lang="zh-CN">并不会成为一个单独的预处理语法单元
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="x-none"> </span><span style="color: #6f008a;background: white" lang="x-none">ADD_STD</span><span style="color: black;background: white" lang="x-none">(x) std::##x
</span><span style="background: white" lang="en-US">//</span><span style="background: white" lang="zh-CN">声明一个</span><span style="background: white" lang="en-US">std::string</span><span style="background: white" lang="zh-CN">对象
</span><span style="color: #6f008a;background: white" lang="en-US">ADD_STD</span><span style="color: black;background: white" lang="x-none">(string) s;</span></p>

<h2 style="margin-top: 0pt;margin-bottom: 18pt;font-size: 11.0pt"><strong><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">行为</span><span style="font-family: Calibri" lang="en-US">4 </span><span style="font-family: 'Microsoft YaHei'" lang="zh-CN">省略变长宏中的逗号</span></strong></h2>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">考虑下面的例子
<span style="color: blue;background: white" lang="en-US"></span><span style="font-size: 9.0pt;color: #7f7f7f;background: white" lang="en-US">#define</span><span style="font-size: 9.0pt;color: #b00000;background: white" lang="x-none"> </span><span style="font-size: 9.0pt;color: #6f008a;background: white" lang="x-none">FUNC2</span><span style="font-size: 9.0pt;color: black;background: white" lang="x-none">(a, …) func(a , ## __VA_ARGS__)
</span><span style="font-size: 9.0pt;color: blue;background: white" lang="en-US">int</span><span style="font-size: 9.0pt;color: black;background: white" lang="en-US"> main()
{
</span><span style="font-size: 9.0pt;color: green;background: white" lang="en-US">// </span><span style="font-size: 9.0pt;color: green;background: white" lang="zh-CN">变长参数在被调用的宏中丢弃</span><span style="font-size: 9.0pt;color: green;background: white" lang="en-US">The variadic argument is missing in the macro being evoked
// </span><span style="font-size: 9.0pt;color: green;background: white" lang="zh-CN">逗号将会移除并替换为</span><span style="font-size: 9.0pt;color: green;background: white" lang="en-US">Comma will be removed and replaced with:
// func(1)
</span><span style="font-size: 9.0pt;color: #6f008a;background: white" lang="en-US">FUNC2</span><span style="font-size: 9.0pt;color: black;background: white" lang="en-US">(1);
</span><span style="font-size: 9.0pt;color: green;background: white" lang="en-US">// </span><span style="font-size: 9.0pt;color: green;background: white" lang="zh-CN">变长参数为空，但不会丢弃，</span><span style="font-size: 9.0pt;color: green;background: white" lang="en-US"> </span><span style="font-size: 9.0pt;color: green;background: white" lang="zh-CN">注意参数列表中的逗号。</span><span style="font-size: 9.0pt;color: green;background: white" lang="en-US"> </span><span style="font-size: 9.0pt;color: green;background: white" lang="zh-CN">当宏被替换时逗号不会移除</span><span style="font-size: 9.0pt;color: green;background: white" lang="en-US">
// func(1, )
</span><span style="font-size: 9.0pt;color: #6f008a;background: white" lang="en-US">FUNC2</span><span style="font-size: 9.0pt;color: black;background: white" lang="en-US">(1, );
}</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="zh-CN">在即将到来的</span><span lang="en-US">C++2a</span><span lang="zh-CN">标准中，</span><span lang="en-US"> </span><span lang="zh-CN">这个问题通过添加</span><span lang="en-US">__VA_OPT_</span><span lang="zh-CN">解决，</span><span lang="en-US"> </span><span lang="zh-CN">这个特性暂时还没有实施</span><span lang="en-US">.</span></p>

<h2 style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><strong><span lang="zh-CN">行为</span><span lang="en-US">5 </span><span lang="zh-CN">宏参数未解包</span></strong></h2>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="zh-CN">在传统预处理程序中，</span><span lang="en-US"> </span><span lang="zh-CN">如果一个宏转发另一个宏依赖的参数，</span><span lang="en-US"> </span><span lang="zh-CN">这时参数被替换时不会解包。</span><span lang="en-US"> </span><span lang="zh-CN">通常这种优化会被忽视，</span><span lang="en-US"> </span><span lang="zh-CN">但是他可以导致不寻常的行为</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="color: green;background: white" lang="en-US">// </span><span style="color: green;background: white" lang="zh-CN">在</span><span style="color: green;background: white" lang="en-US">first</span><span style="color: green;background: white" lang="zh-CN">参数和剩余参数外创建一个字符串
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: #6f008a;background: white" lang="en-US">TWO_STRINGS</span><span style="color: black;background: white" lang="en-US">( first, … ) #first, #__VA_ARGS__
</span><span style="color: gray;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: #6f008a;background: white" lang="en-US">A</span><span style="color: black;background: white" lang="en-US">( … ) </span><span style="color: #6f008a;background: white" lang="en-US">TWO_STRINGS</span><span style="color: black;background: white" lang="en-US">(__VA_ARGS__)
</span><span style="color: blue;background: white" lang="en-US">const</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: blue;background: white" lang="en-US">char</span><span style="color: black;background: white" lang="en-US">* c[2] = { </span><span style="color: #6f008a;background: white" lang="en-US">A</span><span style="color: black;background: white" lang="en-US">(1, 2) };
</span><span style="color: green;background: white" lang="en-US">// </span><span style="color: green;background: white" lang="zh-CN">标准的预处理程序导致</span><span style="color: green;background: white" lang="en-US">:
// const char c[2] = { “1”, “2” };
// </span><span style="color: green;background: white" lang="zh-CN">传统的预处理程序导致所有的参数都在第一个字符串里</span><span style="color: green;background: white" lang="en-US">
// const char c[2] = { “1, 2”, };</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei'"><span style="font-size: 11.0pt" lang="zh-CN">当展开</span><span style="font-size: 11.0pt" lang="en-US">A()</span><span style="font-size: 11.0pt" lang="zh-CN">时，</span><span style="font-size: 11.0pt" lang="en-US"> </span><span style="font-size: 11.0pt" lang="zh-CN">传统预处理程序转发所有</span><span style="font-size: 9.0pt;color: #6f008a;background: white" lang="en-US">__VA_ARGS_</span><span style="font-size: 11.0pt" lang="zh-CN">中打包的参数到</span><span style="font-size: 9.0pt;color: #6f008a;background: white" lang="en-US">TWO_STRINGS</span><span style="font-size: 11.0pt" lang="zh-CN">的第一个参数，</span><span style="font-size: 11.0pt" lang="en-US"> </span><span style="font-size: 11.0pt" lang="zh-CN">它使</span><span style="font-size: 9.0pt;color: #6f008a;background: white" lang="en-US">TWO_STRING</span><span style="font-size: 11.0pt" lang="zh-CN">的变长参数为空</span><span style="font-size: 11.0pt" lang="en-US">. #first</span><span style="font-size: 11.0pt" lang="zh-CN">变为</span><span style="font-size: 11.0pt" lang="en-US">"1</span><span style="font-size: 11.0pt" lang="zh-CN">，</span><span style="font-size: 11.0pt" lang="en-US">2" </span><span style="font-size: 11.0pt" lang="zh-CN">而不是仅仅只是</span><span style="font-size: 11.0pt" lang="en-US">"1".</span><span style="font-size: 11.0pt" lang="zh-CN">如果仔细跟踪，</span><span style="font-size: 11.0pt" lang="en-US"> </span><span style="font-size: 11.0pt" lang="zh-CN">你可能好奇</span><span style="font-size: 11.0pt" lang="en-US">#</span><span style="font-size: 9.0pt;color: #6f008a;background: white" lang="en-US">_VA_ARGS</span><span style="font-size: 11.0pt" lang="en-US">_</span><span style="font-size: 11.0pt" lang="zh-CN">在传统预处理程序中的结果是什么；</span><span style="font-size: 11.0pt" lang="en-US"> </span><span style="font-size: 11.0pt" lang="zh-CN">如果变长参数为空它的值为空字符串字面值</span><span style="font-size: 11.0pt" lang="en-US">"".</span><span style="font-size: 11.0pt" lang="zh-CN">由于另外一个问题，</span><span style="font-size: 11.0pt" lang="en-US"> </span><span style="font-size: 11.0pt" lang="zh-CN">空字符串字面值没有生成</span><span style="font-size: 11.0pt" lang="en-US">.</span></p>
&nbsp;
<h2 style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><strong><span lang="zh-CN">行为</span><span lang="en-US">6 </span><span lang="zh-CN">重新扫描宏里面的替换列表</span></strong></h2>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="zh-CN">在宏被替换后，</span><span lang="en-US"> </span><span lang="zh-CN">影响的标识将会为需要被替换的附加宏标识符重新扫描。</span><span lang="en-US"> </span><span lang="zh-CN">下面的代码里，传统预处理程序在做重新扫描时使用的算法并不符合语言标准</span><span lang="en-US">.</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #7f7f7f;background: white" lang="x-none"> </span><span style="color: #6f008a;background: white" lang="x-none">CAT</span><span style="color: black;background: white" lang="x-none">(a,b) a ## b
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: #6f008a;background: white" lang="en-US">ECHO</span><span style="color: black;background: white" lang="en-US">(…) __VA_ARGS__
</span><span style="color: green;background: white" lang="en-US">// IMPL1 </span><span style="color: green;background: white" lang="zh-CN">和</span><span style="color: green;background: white" lang="en-US"> IMPL2 </span><span style="color: green;background: white" lang="zh-CN">为实现的细节
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: #6f008a;background: white" lang="en-US">IMPL1</span><span style="color: black;background: white" lang="en-US">(prefix,value) do_thing_one( prefix, value)
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define </span><span style="color: #6f008a;background: white" lang="en-US">IMPL2</span><span style="color: black;background: white" lang="en-US">(prefix,value) do_thing_two( prefix, value)
</span><span style="color: green;background: white" lang="en-US">// </span><span style="color: green;background: white" lang="zh-CN">宏将会根据</span><span style="color: green;background: white" lang="en-US">Macro_switch</span><span style="color: green;background: white" lang="zh-CN">的值选择相应的展开方式
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: #6f008a;background: white" lang="en-US">DO_THING</span><span style="color: black;background: white" lang="en-US">(macro_switch, b) </span><span style="color: #6f008a;background: white" lang="en-US">CAT</span><span style="color: black;background: white" lang="en-US">(IMPL, macro_switch) </span><span style="color: #6f008a;background: white" lang="en-US">ECHO</span><span style="color: black;background: white" lang="en-US">(( </span><span style="color: #a31515;background: white" lang="en-US">“Hello”</span><span style="color: black;background: white" lang="en-US">, b))
</span><span style="color: #6f008a;background: white" lang="en-US">DO_THING</span><span style="color: black;background: white" lang="en-US">(1, </span><span style="color: #a31515;background: white" lang="en-US">“World”</span><span style="color: black;background: white" lang="en-US">);
</span><span style="color: green;background: white" lang="en-US">// </span><span style="color: green;background: white" lang="zh-CN">传统的预处理程序
</span><span style="color: green;background: white" lang="en-US">// do_thing_one( “Hello”, “World”);
// </span><span style="color: green;background: white" lang="zh-CN">标准化的预处理程序
</span><span style="color: green;background: white" lang="en-US">// IMPL1 ( “Hello”,”World”);</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei'"><span style="font-size: 11.0pt" lang="zh-CN">虽然这个例子有些刻意</span><span style="font-size: 11.0pt" lang="en-US">,</span><span style="font-size: 11.0pt" lang="zh-CN">但是我们针对真实产品代码测试预处理程序时遇到几次这样的问题</span><span style="font-size: 11.0pt" lang="en-US">. </span><span style="font-size: 11.0pt" lang="zh-CN">我们分解</span><span style="font-size: 9.0pt;color: #6f008a;background: white" lang="en-US">DO_THING</span><span style="font-size: 11.0pt" lang="zh-CN">的展开式来看一下发生了什么</span><span style="font-size: 11.0pt" lang="en-US">.</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="color: #6f008a;background: white" lang="en-US">DO_THING</span><span style="color: black;background: white" lang="x-none">(1, </span><span style="color: #a31515;background: white" lang="x-none">“World”</span><span style="color: black;background: white" lang="x-none">)</span><span style="color: #6f008a;background: white" lang="en-US">— &gt;
CAT</span><span style="color: black;background: white" lang="en-US">(IMPL, 1) </span><span style="color: #6f008a;background: white" lang="en-US">ECHO</span><span style="color: black;background: white" lang="en-US">((</span><span style="color: #a31515;background: white" lang="en-US">“Hello”</span><span style="color: black;background: white" lang="en-US">, </span><span style="color: #a31515;background: white" lang="en-US">“World”</span><span style="color: black;background: white" lang="en-US">))</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt;color: #454545"><span style="background: white" lang="zh-CN">然后</span><span style="background: white" lang="en-US">CAT</span><span style="background: white" lang="zh-CN">被展开为</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="color: #6f008a;background: white" lang="en-US">CAT</span><span style="color: black;background: white" lang="x-none">(IMPL, 1)– &gt; IMPL </span><span style="color: #7f7f7f;background: white" lang="x-none">#</span><span style="color: black;background: white" lang="x-none"># 1 — &gt; IMPL1</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 11.0pt;color: #595959" lang="zh-CN">将单词变为下面的状态</p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span lang="en-US">IMPL1</span><span lang="x-none"> </span><span style="color: #6f008a;background: white" lang="x-none">ECHO</span><span style="color: black;background: white" lang="x-none">((</span><span style="color: #a31515;background: white" lang="x-none">“Hello”</span><span style="color: black;background: white" lang="x-none">, </span><span style="color: #a31515;background: white" lang="x-none">“World”</span><span style="color: black;background: white" lang="x-none">))</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="zh-CN">预处理程序发现了函数式宏标识符</span><span lang="en-US">IMPL1, </span><span lang="zh-CN">但是它的后面没有跟有一个</span><span lang="en-US">"("</span><span lang="zh-CN">，</span><span lang="en-US"> </span><span lang="zh-CN">所以不考虑函数式宏调用</span><span lang="en-US">. </span><span lang="zh-CN">预处理程序移动到下面的单词并找到被调用的函数式宏</span><span lang="en-US">ECHO</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span lang="en-US">ECHO</span><span style="background: white" lang="x-none">((“Hello”, “World”))– &gt; (“Hello”, “World”)</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="en-US">IMPL1</span><span lang="zh-CN">永远不会再考虑展开，</span><span lang="en-US"> </span><span lang="zh-CN">所以展开的结果为</span></p>
<p style="margin: 0in;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span lang="en-US">IMPL1</span><span style="background: white" lang="x-none">(“Hello”, “World”);</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="zh-CN">这个宏也可以通过增加一个间接层使传统预处理程序和标准预处理程序的展开方式一致</span><span lang="en-US">.</span></p>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 9.0pt"><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="x-none"> </span><span style="color: #6f008a;background: white" lang="x-none">CAT</span><span style="color: black;background: white" lang="x-none">(a,b) a##b
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: #6f008a;background: white" lang="en-US">ECHO</span><span style="color: black;background: white" lang="en-US">(…) __VA_ARGS__
</span><span style="color: green;background: white" lang="en-US">// IMPL1 </span><span style="color: green;background: white" lang="zh-CN">和</span><span style="color: green;background: white" lang="en-US"> IMPL2 </span><span style="color: green;background: white" lang="zh-CN">为宏的实现细节
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: #6f008a;background: white" lang="en-US">IMPL1</span><span style="color: black;background: white" lang="en-US">(prefix,value) do_thing_one( prefix, value)
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: #6f008a;background: white" lang="en-US">IMPL2</span><span style="color: black;background: white" lang="en-US">(prefix,value) do_thing_two( prefix, value)
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define</span><span style="color: #b00000;background: white" lang="en-US"> </span><span style="color: #6f008a;background: white" lang="en-US">CALL</span><span style="color: black;background: white" lang="en-US">(macroName, args) macroName args
</span><span style="color: #7f7f7f;background: white" lang="en-US">#define </span><span style="color: #6f008a;background: white" lang="en-US">DO_THING_FIXED</span><span style="color: black;background: white" lang="en-US">(a,b) </span><span style="color: #6f008a;background: white" lang="en-US">CALL</span><span style="color: black;background: white" lang="en-US">( </span><span style="color: #6f008a;background: white" lang="en-US">CAT</span><span style="color: black;background: white" lang="en-US">(IMPL, a), </span><span style="color: #6f008a;background: white" lang="en-US">ECHO</span><span style="color: black;background: white" lang="en-US">(( </span><span style="color: #a31515;background: white" lang="en-US">“Hello”</span><span style="color: black;background: white" lang="en-US">,b)))
</span><span style="color: #6f008a;background: white" lang="en-US">DO_THING_FIXED</span><span style="color: black;background: white" lang="en-US">(1, </span><span style="color: #a31515;background: white" lang="en-US">“World”</span><span style="color: black;background: white" lang="en-US">);
</span><span style="color: green;background: white" lang="en-US">// </span><span style="color: green;background: white" lang="zh-CN">宏展开为</span><span style="color: green;background: white" lang="en-US">:
// do_thing_one( “Hello”, “World”);</span></p>

<h1 style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><strong><span lang="zh-CN">后续</span></strong></h1>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="zh-CN">
预处理程序重写还没有完成</span><span lang="en-US">;</span><span lang="zh-CN">我们会在体验模式下进行修改，</span><span lang="en-US"> </span><span lang="zh-CN">并修复早期使用过程中出现的</span><span lang="en-US">bug.</span></p>

<ul type="disc" style="margin-left: .375in;direction: ltr;margin-top: 0in;margin-bottom: 0in">
 	<li style="margin-top: 0pt;margin-bottom: 18pt;vertical-align: middle"><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt">一些预处理指令将会与传统行为不一样</span></li>
 	<li style="margin-top: 0pt;margin-bottom: 18pt;vertical-align: middle"><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">支持</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US">_Pragma</span></li>
 	<li style="margin-top: 0pt;margin-bottom: 18pt;vertical-align: middle"><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US">C++20</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">特性</span></li>
 	<li style="margin-top: 0pt;margin-bottom: 18pt;vertical-align: middle"><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt">进一步提升诊断能力</span></li>
 	<li style="margin-top: 0pt;margin-bottom: 18pt;vertical-align: middle"><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">使用新的编译选项</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US">/E /P</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">来控制输出</span></li>
 	<li style="margin-top: 0pt;margin-bottom: 18pt;vertical-align: middle"><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">阻碍</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US">Boost</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">的</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US">bug</span>
<ul type="circle" style="margin-left: .375in;direction: ltr;margin-top: 0in;margin-bottom: 0in">
 	<li style="margin-top: 0pt;margin-bottom: 18pt;vertical-align: middle"><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">预处理常量表达式当中的逻辑操作符在新的预处理程序中还没有完全实现，</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">所以在</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US">#if</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">指令上逻辑操作符会回退到传统的预处理程序行为。</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">当不匹配传统预处理的宏展开时，</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US"> </span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">回退行为较为明显</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US">, </span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">在生成</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US">boost</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="zh-CN">预处理程序插槽时也会出现这种情况</span><span style="font-family: 'Microsoft YaHei';font-size: 11.0pt" lang="en-US">.</span></li>
</ul>
</li>
</ul>
<h1 style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><strong><span lang="zh-CN">结语</span></strong></h1>
<p style="margin-top: 0pt;margin-bottom: 18pt;font-family: 'Microsoft YaHei';font-size: 11.0pt"><span lang="en-US">
</span><span lang="zh-CN">欢迎大家下载</span><a href="https://visualstudio.microsoft.com/vs/"><span lang="en-US">VS2017 15.8</span><span lang="zh-CN">预览版</span></a><span lang="zh-CN">并尝试使用所有实验性的新特性</span><span lang="en-US">. </span><span lang="zh-CN">和往常一样，</span><span lang="en-US"> </span><span lang="zh-CN">我们欢迎你们的反馈。可以通过下面的留言或者电邮</span><span lang="en-US">(</span><a href="mailto:visualcpp@microsoft.com"><span style="background: white" lang="en-US">visualcpp@microsoft.com</span></a><span lang="en-US">). </span><span lang="zh-CN">如果你遇到其他</span><span lang="en-US">VS2017 MSVC</span><span lang="zh-CN">编译器的问题，</span><span lang="en-US"> </span><span lang="zh-CN">请通过</span><a href="https://docs.microsoft.com/en-us/visualstudio/ide/how-to-report-a-problem-with-visual-studio-2017"><span style="background: white" lang="en-US">Help &gt; Report A Problem in the product </span></a><span lang="zh-CN">或者</span><a href="https://developercommunity.visualstudio.com/topics/C%2B%2B.html"><span style="background: white" lang="en-US">Developer Community </span></a><span lang="zh-CN">告诉我们</span><span lang="en-US">.
</span><span lang="zh-CN">通过</span><a href="https://visualstudio.uservoice.com/forums/121579-visual-studio-2015/category/30937-languages-c"><span lang="en-US">USERVOICE</span></a><span lang="zh-CN">可以让我们了解你的建议，</span><span lang="en-US"> </span><span lang="zh-CN">你也可以通过</span><span lang="en-US">Twitter </span><a href="https://twitter.com/visualc"><span lang="en-US">VISUAL C </span></a><span lang="zh-CN">与</span><span lang="en-US">Fackbook </span><a href="https://www.facebook.com/msftvisualcpp"><span lang="en-US">msftvisualCpp </span></a><span lang="zh-CN">找到我们</span><span lang="en-US">.</span></p>]]></content:encoded>
    </item>
    <item>
      <title>CMake支持Visual Studio - 代码分析和CMake 3.11</title>
      <link>https://docs.microsoft.com/archive/blogs/c/cmake%E6%94%AF%E6%8C%81visual-studio-%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90%E5%92%8Ccmake-3-11</link>
      <pubDate>Wed, 09 May 2018 02:35:30 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6255</guid>
      <description><![CDATA[[原文发表地址] CMake Support in Visual Studio – Code Analysis and CMake 3.11 

[原文发表时间]...]]></description>
      <content:encoded><![CDATA[<span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">[<span lang="ZH-CN">原文发表地址</span>] </span><a href="https://blogs.msdn.microsoft.com/vcblog/2018/05/02/cmake-support-in-visual-studio-code-analysis-and-cmake-3-11/">CMake Support in Visual Studio – Code Analysis and CMake 3.11</a><span style="color: #000000"> </span></span>

<span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">[<span lang="ZH-CN">原文发表时间</span>] 2018/05/02</span></span>
<div class="site-content" id="content">
<div class="content-area" id="primary"><article class="post-19305 post type-post status-publish format-standard hentry category-cmake tag-announcement tag-c tag-cmake tag-cross-platform-2 tag-ide tag-openfolder" id="post-19305">
<div class="entry-content">

<span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><a href="https://www.visualstudio.com/vs/preview/">Visual Studio 15.7<span lang="ZH-CN">预览版本</span>4</a><span style="color: #000000"><span lang="ZH-CN">现已发布，除了预览版</span>3<span lang="ZH-CN">中添加的</span></span><a href="https://blogs.msdn.microsoft.com/vcblog/2018/04/09/cmake-support-in-visual-studio-targets-view-single-file-compilation-and-cache-generation-settings/"><span lang="ZH-CN">目标视图和单个文件编译</span></a><u><span style="color: #0563c1"> </span></u><span style="color: #000000"><span lang="ZH-CN">功能外，这次我们添加了其它的</span>CMake<span lang="ZH-CN">功能。我们尽可能保持</span>Visual Studio<span lang="ZH-CN">中兼容的</span>CMake<span lang="ZH-CN">版本是最新的，所以我们已将</span>CMake<span lang="ZH-CN">版本更新至</span>3.11<span lang="ZH-CN">。我们也很兴奋地宣布</span>CMake<span lang="ZH-CN">项目现在支持以前需要利用</span>VCXProj<span lang="ZH-CN">的</span>IDE<span lang="ZH-CN">代码分析功能。</span></span></span>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">请下载预览版本并查看最新的</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">CMake<span lang="ZH-CN">功能，例如目标视图，单个文件编译以及何时配置项目的更多控制。与往常一样，我们很乐意听到你的反馈。</span></span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">如果你刚开始接触</span></span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">Visual Studio<span lang="ZH-CN">兼容的</span>CMake<span lang="ZH-CN">功能，请查看博客</span></span><a href="https://blogs.msdn.microsoft.com/vcblog/2016/10/05/cmake-support-in-visual-studio/"><span lang="ZH-CN">如何开始</span></a><span lang="ZH-CN"><span style="color: #000000">。</span></span></span>

<span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 16pt"><span style="color: #000000">CMake<span lang="ZH-CN">项目的代码分析</span></span></span>

在最新的预览版本中，你现在可以在CMake<span>项目上运行</span>Visual Studio<span>的</span><a href="https://docs.microsoft.com/en-us/visualstudio/code-quality/code-analysis-for-c-cpp-overview"><span>全面代码分析工具</span></a><span>。目前，你可以在目标级别运行代码分析。运行单个文件或者整个项目的代码分析选项即将推出</span>

<span style="color: #000000"><span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">要在</span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt">CMake<span lang="ZH-CN">目标上运行代码分析，你可以从</span>CMake<span lang="ZH-CN">菜单中选择</span>”<span lang="ZH-CN">运行代码分析</span>”<span lang="ZH-CN">选项：</span></span></span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/05/CMake-Menu-Code-Analysis.png"><img width="243" height="275" class="size-full wp-image-19315 aligncenter" alt="CMake Menu Code Analysis" src="https://msdnshared.blob.core.windows.net/media/2018/05/CMake-Menu-Code-Analysis.png" /></a>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">或者，如果你使用的是</span></span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><a href="https://blogs.msdn.microsoft.com/vcblog/2018/04/09/cmake-support-in-visual-studio-targets-view-single-file-compilation-and-cache-generation-settings/"><span lang="ZH-CN">目标视图</span></a><span style="color: #000000"><span lang="ZH-CN">，只需要右键单击目标然后选择</span>“<span lang="ZH-CN">运行代码分析</span>”<span lang="ZH-CN">选项：</span></span></span><a href="https://msdnshared.blob.core.windows.net/media/2018/05/Targets-View-Code-Analysis.png"><img width="526" height="527" class="size-full wp-image-19325 aligncenter" alt="Targets View Code Analysis" src="https://msdnshared.blob.core.windows.net/media/2018/05/Targets-View-Code-Analysis.png" /></a>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">所有检测到的分析错误或警告都将显示在输出窗口中：</span></span><a href="https://msdnshared.blob.core.windows.net/media/2018/05/Code-Analysis-Output.png"><img width="1181" height="336" class="size-full wp-image-19335 aligncenter" alt="Code Analysis Output Window" src="https://msdnshared.blob.core.windows.net/media/2018/05/Code-Analysis-Output.png" /></a>

默认情况下，CMake<span>项目使用</span>”<span>微软本机推荐规则</span>”<a href="https://docs.microsoft.com/en-us/visualstudio/code-quality/how-to-set-code-analysis-properties-for-c-cpp-projects"><span>规则集</span></a><span>，但可以通过修改</span>CMakeSettings.json<span>文件来更改该规则。只需将</span>”<strong>CodeAnalysisRuleset</strong>”<span>标记添加到配置中，并使用规则集文件的名称或路径即可。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/05/Code-Analysis-Output.png"></a>

<span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 16pt"><span style="color: #000000">CMake 3.11</span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">为确保你的项目可以利用最新且最好的</span></span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">CMake<span lang="ZH-CN">功能，我们将</span>Visual Studio<span lang="ZH-CN">中兼容的</span>CMake<span lang="ZH-CN">版本从</span>3.10<span lang="ZH-CN">升级到</span>3.11<span lang="ZH-CN">。你可以在</span></span><a href="https://cmake.org/cmake/help/v3.11/release/3.11.html">CMake 3.11<span lang="ZH-CN">发行说明</span></a><span style="color: #000000"><span lang="ZH-CN">中找到</span>CMake 3.11<span lang="ZH-CN">的完整增强列表。</span></span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 16pt"><span style="color: #000000">发送反馈</span></span>

<span lang="ZH-CN" style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">你的反馈是确保我们能够提供最佳</span></span><span style="line-height: 107%;font-family: 'Microsoft YaHei',sans-serif;font-size: 12pt"><span style="color: #000000">CMake<span lang="ZH-CN">体验的关键部分。我们很想知道</span></span><a href="https://www.visualstudio.com/vs/preview/">Visual Studio 2017 Preview</a><span style="color: #000000"><span lang="ZH-CN">如何为你工作。如果你有任何特定于</span>CMake Tools<span lang="ZH-CN">的反馈，请联系</span></span><a href="mailto:cmake@microsoft.com">cmake@microsoft.com</a><span lang="ZH-CN"><span style="color: #000000">。对于一般问题，请</span></span><a href="https://docs.microsoft.com/en-us/visualstudio/ide/how-to-report-a-problem-with-visual-studio-2017"><span lang="ZH-CN">报告问题</span></a><span lang="ZH-CN"><span style="color: #000000">。  </span></span></span>

</div>
</article></div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>C ++代码分析：命令行配置规则</title>
      <link>https://docs.microsoft.com/archive/blogs/c/c-%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90%EF%BC%9A%E5%91%BD%E4%BB%A4%E8%A1%8C%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99</link>
      <pubDate>Tue, 08 May 2018 07:08:53 GMT</pubDate>
      <dc:creator><![CDATA[DevDivChina]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/c/?p=6175</guid>
      <description><![CDATA[[原文发表地址]：C++ code analysis: configure rules from the command...]]></description>
      <content:encoded><![CDATA[<span lang="en-US"><a href="https://msdnshared.blob.core.windows.net/media/2018/05/createruleset.png"></a>[</span><span lang="zh-CN">原文发表地址</span><span lang="en-US">]</span><span lang="zh-CN">：</span><a href="https://blogs.msdn.microsoft.com/vcblog/2018/04/09/c-code-analysis-configure-rules-from-the-command-line/"><span lang="en-US">C++ code analysis: configure rules from the command line</span></a>

<span lang="en-US">[</span><span lang="zh-CN">原文发表时间</span><span lang="en-US">]</span><span lang="zh-CN">：</span><span lang="en-US">2018</span><span lang="zh-CN">年</span><span lang="en-US">4</span><span lang="zh-CN">月</span><span lang="en-US">9</span><span lang="zh-CN">日</span>

<span lang="en-US">[</span><span lang="zh-CN">作者</span><span lang="en-US">]</span><span lang="zh-CN">：</span><span lang="en-US">Sunny Chatterjee </span><span lang="zh-CN">和</span><span lang="en-US"> Andrew Pardoe</span>

<span lang="zh-CN">这篇文章由</span><span lang="en-US">Sunny Chatterjee</span><span lang="en-US">和</span><span lang="en-US">Andrew Pardoe</span><span lang="en-US">撰写。</span>

Visual Studio 15.7预览版3引入了一个新的MSVC编译器开关，/analyze:ruleset用于配置代码分析运行。 此开关的主要目的是用以支持使用C ++代码分析而不使用MSBuild过滤规则的开发人员。 但是，使用MSBuild进行代码分析的开发人员也从这种开关中受益：代码分析运行速度更快，从而提高了编译吞吐量。
<p lang="zh-CN">什么是代码分析规则集？</p>
<span lang="zh-CN">代码分析规则集允许您选择在分析代码时看到的代码分析结果。</span><span lang="en-US"> </span><span lang="en-US">代码分析规则集可</span><span lang="zh-CN">以</span><span lang="en-US">在</span><span lang="zh-CN">项目</span><span lang="en-US">&gt;</span><span lang="en-US">属性</span><span lang="en-US">&gt;</span><span lang="en-US">代码分析</span><span lang="en-US">&gt;</span><span lang="en-US">常规</span><span lang="en-US"> </span><span lang="en-US">中找到。</span><span lang="en-US"> </span><span lang="en-US">默认情况下，新的</span><span lang="en-US">C ++</span><span lang="en-US">项目已选择规则集“</span><span lang="en-US">Microsoft Native Recommended Rules</span><span lang="en-US">”</span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/05/rulesets.png"><img width="1630" height="781" class="alignnone size-full wp-image-6185" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/05/rulesets.png" /></a>

您可以从突出显示的下拉列表中选择您希望应用于项目的规则集。

<span lang="zh-CN">Visual Studio</span><span lang="zh-CN">附带了一些您可以选择的内置规则集。</span><span lang="en-US"> </span><span lang="en-US">它们位于％</span><span lang="en-US">VSINSTALLDIR</span><span lang="en-US">％</span><span lang="en-US">\ Team Tools \ Static Analysis Tools \ Rule Sets</span><span lang="en-US">中。</span><span lang="en-US"> </span><span lang="en-US">我们正在增加这套规则</span><span lang="en-US"> - </span><span lang="en-US">请继续关注</span><a href="https://blogs.msdn.microsoft.com/vcblog"><span lang="en-US">VC</span><span lang="en-US">博客</span></a><span lang="en-US">，了解更多信息。</span>

<span lang="zh-CN">您也可以创建自己的自定义规则集并将其应用于您的项目。</span><span lang="en-US"> </span><span lang="en-US">要创建自定义规则集，请转至文件</span><span lang="en-US">&gt;</span><span lang="en-US">新建</span><span lang="en-US">&gt;</span><span lang="en-US">文件</span><span lang="en-US">&gt;</span><span lang="en-US">常规</span><span lang="en-US">&gt;</span><span lang="en-US">代码分析规则集。</span>

<span lang="en-US"><a href="https://msdnshared.blob.core.windows.net/media/2018/05/createruleset.png"><img width="1370" height="988" class="alignnone size-full wp-image-6195" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/05/createruleset.png" /></a></span>

<span lang="zh-CN">在</span><span lang="en-US">Visual Studio 2017 15.7</span><span lang="en-US">版预览版</span><span lang="en-US">3</span><span lang="en-US">之前，每次运行</span><span lang="en-US">C ++</span><span lang="en-US">代码分析时都会运行所有规则。</span><span lang="en-US"> </span><span lang="en-US">当您为给定项目运行代码分析时，像</span><span lang="en-US">C ++ Core Check</span><span lang="en-US">这样的检查器会生成一个缺陷列表。</span><span lang="en-US"> </span><span lang="en-US">代码分析完成后，会有一个</span><span lang="en-US">MSBuild</span><span lang="en-US">任务将缺陷列表合并到一起，并根据为项目选择的规则集对其进行过滤。</span><span lang="en-US"> </span><span lang="en-US">您只会显示适用于您当前所选代码分析规则集的警告。</span>

如果您在VS环境中构建旧的机制，那么这个旧机制很有效，但有一些地方不足。 首先，如果您在自定义构建环境中使用VS编译器工具集，则不会通过规则集获得任何配置选项。 您必须根据需要过滤的缺陷来编写自己的工具。 其次，在当前的VS环境中，规则集过滤机制本质上是一种后期处理工具 - 检查工具完成所有工作以生成缺陷，最终将其过滤掉。 我们在MSVC编译器工具集中添加 /analyze:ruleset以克服代码分析体验中的这些缺陷。

<span lang="en-US">/analyze:ruleset </span><span lang="zh-CN">是如何工作的？</span>

<span lang="zh-CN">新的</span><span lang="en-US">/ analyze</span><span lang="en-US">：</span><span lang="en-US">ruleset</span><span lang="en-US">选项可以用于任何构建配置：</span><span lang="en-US">VS</span><span lang="en-US">内部或外部，使用</span><span lang="en-US">MSBuild</span><span lang="en-US">，</span><span lang="en-US">Ninja</span><span lang="en-US">或自定义构建系统。</span><span lang="en-US"> </span><span lang="en-US">这个新选项允许编译器根据规则集中指定的一组规则直接过滤缺陷。</span><span lang="en-US"> </span><span lang="en-US">现在编译器已经知道哪些规则是活动的，它可以将这些知识传递给各个检查器，以便他们做出明智的决定。</span><span lang="en-US"> </span><span lang="en-US">例如，如果规则集仅指定类型安全的规则，像生命周期这样的</span><span lang="zh-CN">代价更高</span><span lang="en-US">的检查可以自行关闭，所以您只需</span><span lang="zh-CN">付出</span><span lang="en-US">分析成本方面的</span><span lang="zh-CN">成本</span><span lang="en-US">。</span><span lang="en-US"> </span><span lang="en-US">不必运行未选定的规则意味着您的代码分析体验更快，更流畅。</span>

<span lang="zh-CN">使用</span><span lang="en-US"> </span><span lang="en-US">/analyze:ruleset</span>

<span lang="zh-CN">利用这个新开关很简单：只需定义自己的规则集文件，并在运行代码分析时将该选项传递给编译器。</span><span lang="en-US"> </span><span lang="en-US">这是一个最好循序渐进的例子，</span><span lang="en-US"> </span><span lang="en-US">在这个例子中，我们将检测程序中</span><span lang="zh-CN">所有</span><span lang="en-US">与未初始化变量相关的缺陷。</span>
<ul type="1">
 	<li value="1"><span lang="zh-CN">首先，我们需要确定一组将检测未初始化的变量和内存的规则。</span><span lang="en-US"> </span><span lang="en-US">对于这个例子，我们选择了两条可以帮助我们的规则，</span><span lang="en-US">C6001</span><span lang="en-US">和</span><span lang="en-US">C26494</span><span lang="en-US">。</span></li>
 	<li><span lang="zh-CN">现在需要创建一个规则集文件，其中包含您选择的一组规则。</span><span lang="en-US"> </span><span lang="en-US">我们可以</span><span lang="zh-CN">在</span><span lang="en-US">如上所示</span><span lang="zh-CN">的</span><span lang="en-US">Visual Studio</span><span lang="en-US">中执行此操作，或者我们可以通过编写简单的</span><span lang="en-US">XML</span><span lang="en-US">来手动创建规则集。</span></li>
 	<li><span lang="zh-CN">现在我们有一个如下所示的规则集文件，我们已将其保存为</span><span lang="en-US">UninitVariable.ruleset</span><span lang="en-US">。<a href="https://msdnshared.blob.core.windows.net/media/2018/05/19.png"><img width="877" height="125" class="alignnone size-full wp-image-6205" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/05/19.png" /></a></span></li>
 	<li><span lang="zh-CN">对于这个例子，我们的测试文件如下所示。</span><span lang="en-US"> </span><span lang="en-US">我们将其命名为</span><span lang="en-US">test.cpp</span><span lang="en-US">。<a href="https://msdnshared.blob.core.windows.net/media/2018/05/216.png"><img width="501" height="156" class="alignnone size-full wp-image-6215" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/05/216.png" /></a></span></li>
 	<li><span lang="zh-CN"><span lang="zh-CN"><span lang="zh-CN">我们运行没有任何配置选项的代码分析并观察以下警告:</span></span></span>
<p style="margin-right: 0px" dir="ltr">E:\test&gt;cl.exe /c test.cpp /analyze:plugin EspXEngine.dll</p>
<p style="margin-right: 0px" dir="ltr">Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26329 for x86</p>
<p style="margin-right: 0px" dir="ltr">Copyright (C) Microsoft Corporation.  All rights reserved.</p>
<p style="margin-right: 0px" dir="ltr">test.cpp</p>
<p style="margin-right: 0px" dir="ltr">e:\test\test.cpp(8) : warning C6001: Using uninitialized memory 'i'.: Lines: 3, 4, 8</p>
<p style="margin-right: 0px" dir="ltr">e:\test\test.cpp(3) : warning C26494: Variable 'i' is uninitialized. Always initialize an object (type.5).</p>
<p style="margin-right: 0px" dir="ltr">e:\test\test.cpp(1) : warning C26497: The function 'f' could be marked constexpr if compile-time evaluation is desired (f.4).</p>
<p style="margin-right: 0px" dir="ltr">e:\test\test.cpp(1) : warning C26440: Function 'f' can be declared 'noexcept' (f.6).</p>
</li>
 	<li> <span lang="zh-CN">接下来，我们传递额外的编译器选项来指定我们的自定义规则集来识别未初始化的变量：</span><span lang="en-US">/ analyze</span><span lang="en-US">：</span><span lang="en-US">ruleset UninitVariable.ruleset</span><span lang="en-US">。</span></li>
</ul>
<p style="padding-left: 30px">E:\test&gt;cl.exe /c test.cpp /analyze:plugin EspXEngine.dll /analyze:ruleset UninitVariable.ruleset</p>
<p style="padding-left: 30px">Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26329 for x86</p>
<p style="padding-left: 30px">Copyright (C) Microsoft Corporation.  All rights reserved.</p>
<p style="padding-left: 30px">test.cpp</p>
<p style="padding-left: 30px">e:\test\test.cpp(8) : warning C6001: Using uninitialized memory 'i'.: Lines: 3, 4, 8</p>
<p style="padding-left: 30px">e:\test\test.cpp(3) : warning C26494: Variable 'i' is uninitialized. Always initialize an object (type.5).</p>
<span lang="zh-CN">使用</span><span lang="en-US">/ analyze</span><span lang="en-US">：</span><span lang="en-US">ruleset</span><span lang="en-US">选项，代码分析仅运行未初始化变量的规则，并且与这些规则无关的其他警告不再显示。</span>
<p style="padding-left: 30px"></p>
<b>最后</b>

我们希望您会发现/analyze：ruleset选项对于在您的私有构建环境中配置代码分析运行是有用的。 我们已经开始利用它了！ 例如，我们在Visual Studio中代码分析的目标文件， 现在运行代码分析时将/ analyze：ruleset选项传递给编译器。 这样我们可以根据选定的规则集优化我们的检查。 我们将在未来推出新的默认规则集，并在Visual Studio中提供支持，以在CMake for Ninja和Visual Studio等构建环境中运行C ++代码分析。

同平时一样，我们欢迎您的反馈。 我们可以通过下面的评论或通过电子邮件（visualcpp@microsoft.com）联系到。

如果您在Visual Studio 2017中遇到MSVC的其他问题，请通过<a href="https://docs.microsoft.com/en-us/visualstudio/ide/how-to-report-a-problem-with-visual-studio-2017">帮助&gt;报告产品中的问题</a>或通过<a href="https://developercommunity.visualstudio.com/topics/C%2B%2B.html">开发者社区</a>告诉我们。 让我们通过<a href="https://visualstudio.uservoice.com/forums/121579-visual-studio-2015/category/30937-languages-c">UserVoice</a>了解您的建议。 您还可以在Twitter（<a href="https://twitter.com/visualc">@VisualC</a>）和Facebook（<a href="https://www.facebook.com/msftvisualcpp">msftvisualcpp</a>）上找到我们。]]></content:encoded>
    </item>
  </channel>
</rss>