VSCode的C/C++扩展功能

  • 1. 在 Linux 上 使用 C++
  • 1.1 创建 Hello World
  • 1.2 探索 IntelliSense
  • 1.3 构造 helloworld.cpp
  • 1.3.1 运行 build
  • 1.3.2 修改 tasks.json
  • 1.4 Debug helloworld.cpp
  • 1.4.1 启动调试会话
  • 1.5 一步步执行代码
  • 1.6 设置一个 Watch
  • 1.7 C/C++ 配置
  • 2. 一些快捷键
  • 2.1 导航到当前源文件中的一个特定的符号(Ctrl+P, @符号名称)
  • 2.2 导航到其他源文件中的一个特定的符号(Ctrl+P, #符号名称)
  • 2.3 转到定义(F12)
  • 2.4 查看定义(Alt + F12)
  • 2.5 Ctrl + 光标悬停


Reference:

  1. Visual Studio Code的C/C++扩展功能
  2. Using C++ on Linux in VS Code

vscode XHR扩展国内镜像源_c++

1. 在 Linux 上 使用 C++

1.1 创建 Hello World

从 terminal 窗口,创建一个叫做 projects 的空文件夹来存储 VS Code 项目。然后创建一个叫做 helloworld 的子文件夹,导航到里面后,输入最下面的命令打开 VS Code:

mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

code . 命令打开当前文件夹下的 VS Code,也就是 ”workspace“。在该 workspace 内的 .vscode 文件夹下会创建三个文件:

  • tasks.json (compiler build 设置)
  • launch.json (debugger 设置)
  • c_cpp_properties.json (compiler path and IntelliSense 设置)

创建文件 helloworld.cpp 并复制以下源代码:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};

    for (const string& word : msg){
        cout << word << " ";
    }
    cout << endl;
}

1.2 探索 IntelliSense

helloworld.cpp 文件中,将鼠标悬停在 vectorstring 上查看类型信息。在申明 msg 变量后面,开始输入 msg.。这时看到一个显示所有成员函数的补全列表,以及一个显示 msg 对象类型信息的窗口:

vscode XHR扩展国内镜像源_vscode XHR扩展国内镜像源_02

Tab 键插入选中的成员。然后,当添加开括号时,会看到关于函数所需参数的信息。

1.3 构造 helloworld.cpp

这时需要创建一个 tasks.json 文件来告诉 VS Code 如何构造(搭建)该程序。这个文件会唤醒 g++ 编译器,并从源代码创建一个可执行文件

在编辑器中打开 helloworld.cpp 非常重要,因为下一步将使用上下文编辑器中的 active file(活动文件:该文件处于可编辑或更改状态,内容、大小及属性都是可以随时间变化的) 来创建下一步的构建任务:

在主菜单中,选择 Terminal > Configure Default Build Task。下拉菜单显示了C++编译器的各种预定义构建任务,这里选择 C/C++: g++ build active file。

vscode XHR扩展国内镜像源_c++_03

这里会在 .vscode 文件夹内创建一个 tasks.json 文件并在编译器内打开它。这时的 tasks.json 文件看起来应该跟下面的 JSON 相似:

{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "label": "g++ build active file",
      "command": "/usr/bin/g++",
      "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
      "options": {
        "cwd": "/usr/bin"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

可以在variables reference了解更多关于 task.json 变量。

command 设置指定要运行的程序;在本例中,使用的是 g++。args 数组指定将传递给 g++ 的命令行参数。这些参数必须按照编译器期望的顺序指定。

这个文件告诉 g++ 获取 active file(${file}),编译它,并在当前目录(${fileDirname})中创建一个与 active file 同名但没有扩展名(${fileBasenameNoExtension})(比如.exe等)的可执行文件,从而得到示例中的 helloworld

label 的值是会在 tasks list 中看到的,可以给它随便命名。

group 对象中的 "isDefault": true 值指定该任务将在按下 Ctrl+Shift+B 时运行。这个属性只是为了方便;如果将这个值设置为 false,仍然可以从终端菜单的 Tasks: Run Build Task 运行它。

1.3.1 运行 build

  1. 回到 helloworld.cpp。现在的任务是搭建 active file,这时想要搭建 helloworld.cpp
  2. 为了运行定义在 tasks.json 内的 build task,按下 Ctrl+Shift+B 或者从主菜单 Terminal 选择 Run Build Task。
  3. 当任务开始时,会看到集成终端面板出现在源代码编辑器下面。任务完成后,终端显示编译器的输出,指示构建是成功还是失败。对于一个成功的 g++ 构建,输出如下所示:
  4. 使用 + 按钮创建一个新的终端,将会拥有一个运行默认 shell 的终端,并将 helloworld 文件夹作为工作目录。运行 ls,应该看到可执行文件 helloworld(没有文件扩展名)。
  5. 可以通过输入 ./helloworld 在终端运行 helloworld

1.3.2 修改 tasks.json

也可以修改 tasks.json 文件,用 "${workspaceFolder}/*.cpp" 替代 ${file} 来构建多个 C++ 文件。也可以通过用硬编码的文件名(例如helloworld.out)替换 "${fileDirname}/${fileBasenameNoExtension}" 来修改输出文件名。

1.4 Debug helloworld.cpp

接下来,将创建一个 launch.json 文件。当按下 F5

从主菜单上,选择 Run > Add Configuration,然后选择 C++ (GDB/LLDB)。

然后,会看到一个用于各种预定义调试配置的下拉菜单。选择 g++ build and debug active file。

vscode XHR扩展国内镜像源_c++_04

这时 VS Code 创建了一个 launch.json 文件。在编辑器中打开它,并搭建和运行 ‘helloworld’。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "g++ build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "g++ build active file",
      "miDebuggerPath": "/usr/bin/gdb"
    }
  ]
}

在上面的 JSON,prgoram 指定想要去 debug 的程序。在这里,它被设置为 active file folder ${fileDirname} 和没有扩展名的 active filename ${fileBasenameNoExtension},如果 helloworld.cpp 是所需的 active file,那就是 helloworld

默认情况下,C++ 扩展不会向源代码添加任何断点,stopAtEntry 值设置为 false

stopAtEntry 值更改为 true,以使调试器在开始调试时main 方法上停止。

1.4.1 启动调试会话

  1. 返回 hellloworld.cpp 使得该程序变为 active file。
  2. 按下 F5 或从主菜单中选择 Run > Start Debugging。在开始逐步分析代码之前,让我们花点时间注意用户界面中的几个变化:
  • 集成终端显示在源代码编辑器的底部。在 Debug Output
  • 编辑器高亮 main 方法中的第一个语句。这是 C++ 扩展自动为您设置的一个断点:
  • 在左侧的“Run”视图中显示调试信息。将在本教程后面看到一个示例。
  • 在代码编辑器的顶部,出现一个调试控制面板。可以通过抓取左边的点在屏幕上移动它。

1.5 一步步执行代码

现在开始一步步执行代码:

  1. 点击调试控制面板上的 Step over 图标。

    这将把程序执行推进到 for 循环的第一行,并跳过在创建和初始化 msg 变量时调用的 vectorstring 类中的所有内部函数调用。注意旁边变量窗口中的变化。
  2. 再次按 Step over 键进入程序中的下一条语句(跳过所有用于初始化循环的内部代码)。现在,Variables
  3. 再次按Step执行cout语句。(请注意,在2019年3月发布的版本中,c++扩展在最后一次cout执行之前不会向调试控制台输出任何输出。)
  4. 如果愿意,可以一直按 Step over 键,直到向量中的所有单词都被打印到控制台上。但如果您对此感到好奇,请尝试按 Step Into 按钮来逐步浏览 C++ 标准库中的源代码!

    要返回到自己的代码,一种方法是一直按 Step over。另一种方法是在代码中设置断点,方法是切换到代码编辑器中的 helloworld.cpp 标签,将插入点放在循环中 cout 语句的某个位置,然后按F9。左边的 gutter 中出现一个红点,表示已在该行设置了断点。

    然后按 F5 从标准库头的当前行开始执行。执行将会在 cout 中断。如果愿意,可以再次按 F9 关闭断点。

    当循环完成时,您可以在集成终端的 Debug Console 选项卡中看到输出,以及由 GDB 输出的其他一些诊断信息。

1.6 设置一个 Watch

要在程序执行时跟踪变量的值,请对该变量设置一个 watch。

  1. 将插入点放置在循环内部。在 watch 窗口中,单击加号,并在文本框中输入 word,这是循环变量的名称。现在,在遍历循环时查看 Watch 窗口。
  2. 要在断点上暂停执行时快速查看任何变量的值,可以使用鼠标指针悬停在该变量上。

1.7 C/C++ 配置

如果要更好地控制 C/C++ extension,可以创建一个 c_cpp_properties.json 文件,该文件将允许更改设置,例如编译器的路径、包含路径、C++标准(默认值为 C++17)等。

可以通过运行命令面板(Ctrl+Shift+P)中的命令 C/C++: Edit Configurations (UI) 来查看 C/C++ 配置 UI。

vscode XHR扩展国内镜像源_vscode XHR扩展国内镜像源_05


这将打开 C/C++ Configurations 页。在此处进行更改时,VS Code 会将它们写入 .vscode 文件夹中名为 c_cpp_properties.json 的文件。

vscode XHR扩展国内镜像源_vscode_06


仅当程序包含不在工作区或标准库路径中的头文件时,才需要修改 Include path

VS Code 将这些设置放在 .vscode/c_cpp_properties.json 中。如果直接打开该文件,它应该如下所示:

{
  "configurations": [
    {
      "name": "Linux",
      "includePath": ["${workspaceFolder}/**"],
      "defines": [],
      "compilerPath": "/usr/bin/gcc",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "clang-x64"
    }
  ],
  "version": 4
}

2. 一些快捷键

2.1 导航到当前源文件中的一个特定的符号(Ctrl+P, @符号名称)

vscode XHR扩展国内镜像源_vscode_07

2.2 导航到其他源文件中的一个特定的符号(Ctrl+P, #符号名称)

vscode XHR扩展国内镜像源_vscode XHR扩展国内镜像源_08

2.3 转到定义(F12)

vscode XHR扩展国内镜像源_vscode_09

2.4 查看定义(Alt + F12)

vscode XHR扩展国内镜像源_vscode_10

2.5 Ctrl + 光标悬停

vscode XHR扩展国内镜像源_c++_11