如何在 Visual Studio 中启用 C++17 编译?

Posted

技术标签:

【中文标题】如何在 Visual Studio 中启用 C++17 编译?【英文标题】:How to enable C++17 compiling in Visual Studio? 【发布时间】:2017-05-09 14:26:06 【问题描述】:

我想使用 C++17 功能。

如何在 Microsoft Visual Studio 中将编译从 C++14 切换到 C++17?

或者它在 VS 的发布版本中不可用?

【问题讨论】:

C++17 有哪些特性?哪个版本的 Visual Studio?如果您问的是 C++17,为什么要标记您的问题 c++11c++14 c++17 不可用,我认为对 C++ 特定版本感兴趣的人更知道如何切换它。例如,我希望 std::vector.emplace_back() 返回对新创建元素的引用。我知道 +1 行,我得到了那个参考,但无论如何我想知道我的问题的答案。 VS 社区 2015(14.0.25431.01 更新 3) 你应该在这里查看:blogs.msdn.microsoft.com/visualstudio 你不能在 VS 中启用特定的语言方言,你会得到他们实现的任何东西。如果您使用的是 VS21015,那么您可能会对 C++17 中的标准库功能有很好的运气,但在语言功能方面则不然。 @preat MSVC 2017 有一个“最新”设置,但尚未发布。 【参考方案1】:

现在有一个下拉菜单(至少从 VS 2017.3.5 开始),您可以在其中专门选择 C++17。可用选项是(在项目 > 属性 > C/C++ > 语言 > C++ 语言标准下)

ISO C++14 标准。 msvc 命令行选项:/std:c++14 ISO C++17 标准。 msvc 命令行选项:/std:c++17

Visual Studio 2021:

ISO C++20 标准。 msvc 命令行选项:/std:c++20

任何 Visual Studio:

最新的草案标准。 msvc 命令行选项:/std:c++latest

【讨论】:

语法-std:c++14-std:c++17-std:c++latest 也有效,例如当您更喜欢手动输入编译器选项时(使用 VS2017 测试)。 答案是否还不清楚,或者您是指- 而不是我列出的/std: 开关? 我看到来自gccclang 的好处。然后- 的侵入性较小(但是语法仍然略有不同(: 而不是=)。 @AndreiKrasutski。目前还没有 ISO C++20,但在 /std:c++latest 中有一些支持。 C++20 标准预计在明年推出。我在答案中的评论中进行了编辑。 如果在 Visual Studio 2017 > 项目属性 > C / C++ > 语言 > C++ 标准下拉菜单中未选择任何内容,则使用什么 C++ 标准?我在下拉列表中有 14、17 和最新的,但没有选择,那么在这种情况下如何找到项目中使用的 c++ 标准?【参考方案2】:

MSBuild(Visual Studio 项目/解决方案*.vcproj/*.sln

添加到项目设置中的附加选项:/std:c++latest 以启用最新功能 - 目前为 VS2017 的 C++17、VS2015 Update 3。

https://blogs.msdn.microsoft.com/vcblog/2016/06/07/standards-version-switches-in-the-compiler/

/permissive- 将禁用非标准 C++ 扩展,并在 VS2017 中启用标准一致性。

https://blogs.msdn.microsoft.com/vcblog/2016/11/16/permissive-switch/

编辑(2018 年 10 月):此处记录了最新的 VS2017 功能:

https://docs.microsoft.com/en-gb/cpp/build/reference/std-specify-language-standard-version

VS2017 现在支持:/std:[c++14|c++17|c++latest]。这些标志可以通过项目的属性页设置:

在 Visual Studio 开发中设置此编译器选项 环境

    打开项目的“属性页”对话框。有关详细信息,请参阅工作 与项目属性。 选择配置属性,C/C++, 语言。 在 C++ 语言标准中,选择要使用的语言标准 从下拉控件中支持,然后选择 OK 或 Apply 保存 您的更改。

CMake

Visual Studio 2017 (15.7+) 支持 CMake 项目。 CMake 使得以各种方式启用现代 C++ 功能成为可能。最基本的选项是通过在 CMakeLists.txt 中设置 a target's property 来启用现代 C++ 标准:

add_library ($PROJECT_NAME)
set_property (TARGET $PROJECT_NAME
  PROPERTY
    # Enable C++17 standard compliance
    CXX_STANDARD 17
)

在接口库的情况下:

add_library ($PROJECT_NAME INTERFACE)
target_compile_features ($PROJECT_NAME
  INTERFACE
    # Enable C++17 standard compliance
    cxx_std_17
)

【讨论】:

我在 VS2017 中做了下拉菜单,但编译器仍然继续应用 C++98 标准,这到底是什么【参考方案3】:

Visual Studio 2015 Update 3 不支持您正在寻找的 C++17 功能(emplace_back() 返回参考)。

Support For C++11/14/17 Features (Modern C++)

C++11/14/17 Features In VS 2015 RTM

VS 2015 Update 2’s STL is C++17-so-far Feature Complete

Visual Studio 2015 Update 3

STL Fixes In VS 2015 Update 3

【讨论】:

【参考方案4】:

如果将现有的 Visual Studio 2015 解决方案引入 Visual Studio 2017 并且您想使用 c++17 本地编译器构建它,您应该首先将解决方案/项目重新定位到 v141 ,然后下拉菜单将如上所述出现(配置属性-> C/C++ -> 语言 -> 语言标准)

【讨论】:

【参考方案5】:

Visual Studio 2019 版:

下拉菜单移至:

右键单击项目(不是解决方案) 属性(或 Alt + Enter) 从左侧菜单中选择配置属性 常规 中间有一个名为“C++ 语言标准”的选项 旁边是下拉菜单 您可以在此处选择默认、ISO C++ 14、17 或最新版

【讨论】:

记得对“所有配置”和“所有平台”执行此操作。那是一个花了 2 小时弄清楚为什么它仍然不起作用的人!不过谢谢你的回答。【参考方案6】:

VS Code 2020 版

tasks.json 文件中,(在您使用g++-9 构建和调试之后)

添加 -std=c++2a 用于 2020 功能(c++1z 用于 2017 功能)。 添加-fconcepts 使用concept 关键字

"args": [
   "-std=c++2a",
   "-fconcepts",
   "-g",
   "$file",
   "-o",
   "$fileDirname/$fileBasenameNoExtension"
],

现在编译,您可以使用 2020 年的功能。

【讨论】:

没有 Visual Studios 2020,这是针对 V.S.代码 但问题不是问“仅适用于”VS Studio。如果您重新阅读该问题,请在行尾“它在 VS 的发行版本中不可用?”。问题是灵活的,不需要严格。 这个问题不是那么灵活,如果是,就需要关闭。会不够专注。 VS Code 不是 Visual Studio 的不同版本。一个是集成开发环境,一个是编辑器。一个提取您编写的代码,另一个嵌入到它正在处理的项目的文件系统中。一个是微软资助的,一个是微软开发的。一个可以移植到 Linux,一个不能。一个配置,对另一个不起作用。不妨回答一下如何在记事本中编译C++17。 我了解您希望我删除答案。不幸的是,我不会像你那样解释它。在您发表评论之前,我投了赞成票,我相信我的回答会引导用户。 SO中的答案中有大量缺失的部分。也许你也应该检查它们。同时,我的回答可能会为用户提供解决方案。

以上是关于如何在 Visual Studio 中启用 C++17 编译?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2015 隔离外壳中启用PrivateGalleries

如何在 Visual Studio 2017 中启用 WiX 项目

如何在 Visual Studio 2017 中启用 TFS 跟踪

如何在 Visual Studio 中启用 NuGet 包还原?

如何在 Visual Studio 中(重新)启用实时 CSS 编辑?

如何在 Visual Studio 2019 中启用编译器警告?