如何在VSCode C++扩展中启用C++17支持

58
我一直在std :: string_view上获取错误波浪线,但是我能够正常构建。有没有办法告诉智能感知或C ++检查器使用C ++17?
我得到的具体错误是:
namespace "std" has no member "string_view"

从未成功地使其在C++17上正常工作,VS也是如此。 - Ivan Sanz Carasa
相关链接:https://stackoverflow.com/q/48283026/3258851 - Marc.2377
9个回答

71

现在这变得容易多了。在您的vs代码扩展设置中搜索cppstandard,并从下拉菜单中选择您想要使用的C++版本。

输入图像描述

为确保您的调试器使用相同的版本,请确保您的tasks.json有类似以下内容的东西,其中重要的行是--std和其后面定义的版本行。

{
  "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: g++ build active file",
      "command": "/usr/bin/g++",
      "args": [
        "-std=c++17",
        "-I",
        "${fileDirname}",
        "-g",
        "${fileDirname}/*.cpp",
        "-o",
        "${workspaceFolder}/out/${fileBasenameNoExtension}.o"
      ],
      "options": {
        "cwd": "${workspaceFolder}"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ],
  "version": "2.0.0"
}
请注意,如果您直接复制上述的 tasks.json,则需要在您的工作区根目录下有一个名为 out 的文件夹。

1
您还可以在项目级别上进行设置 https://code.visualstudio.com/docs/cpp/config-msvc#_cc-configurations (这将创建位于项目目录中的 .vs_code/c_cpp_properties.json 文件)。 - Maciej Krawczyk
3
对于 std::byte,这种方法无效。在 VSCode 上仍未找到解决方法,而我们已经到了 2022 年。 - Paprika
1
我也遇到了使用 std::filesystem 的同样问题。 - desmond13
1
tasks.json与调试器无关。 - Bulletmagnet
那么每次我开始一个新项目都必须这样做吗? - Tyrcnex

20

这正是我担心的事情。我也看到了那个 Github 问题,但似乎回复初始帖子的人无法重现该问题。 - ajoseps
3
很好笑,我的设置是c++17,但仍然找不到<optional> :angry: - jaques-sam
2
@DrumM 这正是我正在寻找的,<可选项>。虽然我可以编译,但是VS Code给我红色下划线标示实在很烦人。无论如何,没关系。 - RTHarston
1
更新:我找到了解决方法。我尝试按照“设置C++标准”链接的建议,在msvc.json文件的“defaults”部分中加入了-std=C++17,但没有起作用。问题在于我把它放错了文件里。我更改了Windows用户文件夹中.vscode文件夹中的文件,但我正在WSL中使用VS Code,所以我必须编辑WSL用户文件夹中的msvc.json文件。当我这样做时,红色波浪线消失了! - RTHarston
2
我没有看到关于 msvc.json 文件的任何文档,只有 c_cpp_properties.json。为什么后者不够用呢? - jaques-sam

7

更新一下,我也遇到了这个问题。

我通过添加 c_cpp_properties.json 文件来解决它。

  1. Ctrl + Shift + P then select C/C++:Edit Configurations (JSON)

  2. Adjust the content for cStandard and cppStandard:

        "cStandard": "gnu17",
        "cppStandard": "gnu++17",
    

1
它对我没有起作用。 - desmond13

3

对于在Linux上尝试并安装了GCC 7.5.0的人,这对我有用。
执行以下两个步骤以使linter能够识别c++17编写,并使编译器选择c++17。

  1. 打开C/C++:Edit Configurations (JSON),并将这两个字段的默认值更改为:

"cStandard": "gnu18", "cppStandard": "gnu++17",

  1. 打开.vscode目录下的tasks.json文件,并将以下语句添加到args键中:

"--std", "c++17"


2

如果您在尝试@Marc.2377@W Kenny的解决方案后仍无法启用,请按照以下步骤操作:

  1. .vscode文件夹中打开tasks.json
  2. "args:"下添加"--std","c++17"
  3. 保存tasks.json

5
这将改变编译器的工作方式,而不是代码检查工具。 - Abhay Patil
适用于我。Linux、VS Code、C++17。谢谢。 - Celal Ergün

1
尝试了很多方法后,我发现为使用CMake并想要编辑CMakeLists.txt文件的人们可能有一个解决方案。我只需在我的CMakeLists.txt开头加入以下行:set (CMAKE_CXX_STANDARD 17)。您可以通过执行以下操作检查您的c++版本:cout << __cplusplus;第3和第4个数字会给出您正在使用的c++版本。例如:cout << __cplusplus;201703表示您正在使用c++ 17,cout << __cplusplus;201402表示您正在使用c++ 14。我认为一定有更简单的解决方案,但我还没有找到它。

1

除了在其他帖子中提到的在c_cpp_properties.json中将cppStandard设置为gnu++17之外,您还需要将__cplusplus定义更改为相应的值(例如201703L)。

像这样:

{
  "version": 4,
  "configurations": [
    {
      // ...
      "cStandard": "gnu17",
      "cppStandard": "gnu++17",
      "defines": [
        // ...
        "__cplusplus=201703L"
        // ...
      ]
    }
  ]
}

如果正确设置了-std参数,则不需要这个;请参见https://dev59.com/HV8e5IYBdhLWcg3wF3WV,该宏应自动设置。 - Philipp Ludwig

0

我尝试编辑 C_Cpp>Default: Cpp StandardC Standard 的设置,将它们指定为 C++17 标准。但是,那并没有起作用。

接着我在项目目录下找到了一个 .vscode 文件夹,并进入其中的 c_cpp_properties.json 文件。在里面我发现了一些未编辑的设置,我之前指定使用的是 C++11 标准。当我更改为正确的标准后,问题就解决了。

如果你发现上述答案不起作用,或许我们犯了相同的错误。


-1
在命令行上使用 g++ --version 检查您的 g++ 版本。如果它是版本 6 或 7,那么您需要使用 mingw 更新到更新的版本。我使用 mysys2 来完成这个操作,现在我没有同样的问题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接