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. 在 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
文件中,将鼠标悬停在 vector
或 string
上查看类型信息。在申明 msg
变量后面,开始输入 msg.
。这时看到一个显示所有成员函数的补全列表,以及一个显示 msg
对象类型信息的窗口:
按 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
文件夹内创建一个 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
- 回到
helloworld.cpp
。现在的任务是搭建 active file,这时想要搭建helloworld.cpp
。 - 为了运行定义在
tasks.json
内的 build task,按下 Ctrl+Shift+B 或者从主菜单 Terminal 选择 Run Build Task。 - 当任务开始时,会看到集成终端面板出现在源代码编辑器下面。任务完成后,终端显示编译器的输出,指示构建是成功还是失败。对于一个成功的 g++ 构建,输出如下所示:
- 使用 + 按钮创建一个新的终端,将会拥有一个运行默认 shell 的终端,并将
helloworld
文件夹作为工作目录。运行ls
,应该看到可执行文件helloworld
(没有文件扩展名)。 - 可以通过输入
./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。
这时 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 启动调试会话
- 返回
hellloworld.cpp
使得该程序变为 active file。 - 按下 F5 或从主菜单中选择 Run > Start Debugging。在开始逐步分析代码之前,让我们花点时间注意用户界面中的几个变化:
- 集成终端显示在源代码编辑器的底部。在 Debug Output
- 编辑器高亮
main
方法中的第一个语句。这是 C++ 扩展自动为您设置的一个断点: - 在左侧的“Run”视图中显示调试信息。将在本教程后面看到一个示例。
- 在代码编辑器的顶部,出现一个调试控制面板。可以通过抓取左边的点在屏幕上移动它。
1.5 一步步执行代码
现在开始一步步执行代码:
- 点击调试控制面板上的 Step over 图标。
这将把程序执行推进到 for 循环的第一行,并跳过在创建和初始化ms
g 变量时调用的vector
和string
类中的所有内部函数调用。注意旁边变量窗口中的变化。 - 再次按 Step over 键进入程序中的下一条语句(跳过所有用于初始化循环的内部代码)。现在,Variables
- 再次按Step执行cout语句。(请注意,在2019年3月发布的版本中,c++扩展在最后一次cout执行之前不会向调试控制台输出任何输出。)
- 如果愿意,可以一直按 Step over 键,直到向量中的所有单词都被打印到控制台上。但如果您对此感到好奇,请尝试按 Step Into 按钮来逐步浏览 C++ 标准库中的源代码!
要返回到自己的代码,一种方法是一直按 Step over。另一种方法是在代码中设置断点,方法是切换到代码编辑器中的helloworld.cpp
标签,将插入点放在循环中cout
语句的某个位置,然后按F9。左边的 gutter 中出现一个红点,表示已在该行设置了断点。
然后按 F5 从标准库头的当前行开始执行。执行将会在cout
中断。如果愿意,可以再次按 F9 关闭断点。
当循环完成时,您可以在集成终端的 Debug Console 选项卡中看到输出,以及由 GDB 输出的其他一些诊断信息。
1.6 设置一个 Watch
要在程序执行时跟踪变量的值,请对该变量设置一个 watch。
- 将插入点放置在循环内部。在 watch 窗口中,单击加号,并在文本框中输入
word
,这是循环变量的名称。现在,在遍历循环时查看 Watch 窗口。 - 要在断点上暂停执行时快速查看任何变量的值,可以使用鼠标指针悬停在该变量上。
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。
这将打开 C/C++ Configurations 页。在此处进行更改时,VS Code 会将它们写入 .vscode
文件夹中名为 c_cpp_properties.json
的文件。
仅当程序包含不在工作区或标准库路径中的头文件时,才需要修改 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, @符号名称)
2.2 导航到其他源文件中的一个特定的符号(Ctrl+P, #符号名称)
2.3 转到定义(F12)
2.4 查看定义(Alt + F12)
2.5 Ctrl + 光标悬停