前一节指路:用 VS code(并不)欢乐地编写 C/C++ 程序的新手教程【Part 1】
官方教程指路:Using GCC with MinGW
目录
调试程序
这里要再三注意文件路径中不能出现中文,如果出现的话,赶紧回去改,否则接下来会一直报错到怀疑人生。
- 生成
launch.json
。-
按下
F5
或者点击左侧“运行”→“运行和调试”。
-
在唤出的面板中选择“C++ (GDB/LLDB)”以启动 GDB 调试器。
-
在各种预先定义的调试配置的下拉菜单中选择“g++.exe - 生成和调试活动文件”。
-
此时我们将会得到一个
launch.json
,内容大致如下所示。
-
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\Apps\\Compilers\\mingw64\\bin\\gdb.exe",// 调试所调用的编译器的绝对路径
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
]
}
- 设置程序断点。
我们注意到,如果没有在程序中设置断点的话,此时调试控制台有如下输出:
程序会一直运行到断点之前,并在终端面板输出断点之前的输出结果。由于我们并没有设置断点,因此程序一直运行到退出,并在调试控制台处返回正常退出的结果。
现在我们增加断点试试。- 在第 11 行增设一个断点。
- 点击左上角的这个绿色三角形“开始调试”。
- 此时代码编辑器窗口顶部会出现调试控制面板。
单击“单步跳过(F10)”可以推进程序运行。 - 此时的界面如下:
左侧列出了程序中的变量。我们也可以点击“监视”栏的 “+” 号添加我们需要重点关注的变量。
我们输入word
后就可以密切观察到该变量的变化过程了。 - 在我们不断点击“单步跳过”的过程中,可以观察到随着
word
值的不断变化,下方终端也在逐个输出单词。 - 如果想了解更多的实现细节的话,可以点击“单步调试(F11)”,进入 C++ 标准库中的源代码。
- 在第 11 行增设一个断点。
C/C++ 配置
通过配置文件 c_cpp_properties.json
能够更改 C/C++ 扩展的一些设置。
打开命令面板(快捷键 Ctrl+Shift+P
)→选择“C/C++ 编辑配置(UI)”。
此处将可以更改编译器路径、包含路径、C 标准和 C++ 标准等。
所有的更改都会修改 c_cpp_properties.json
中的值。该文件会在你打开 C/C++ 扩展设置后自动保存在当前文件夹的 .vscode
文件夹中。你可以在以下两处打开该配置文件:
添加自定义头文件
近期沉迷于 LeetCode 刷题,但是在 Web 端写代码无法调试(贫穷的我没有钱开会员),每次只能手撕很痛苦;但是 LeetCode 的答题区域只给个接口,前后的内容每次都要手动补充挺麻烦的,于是就和朋友一起完善了一个方便本地编辑调试 LeetCode 代码的头文件。
但是在使用过程中发现,我们的这个头永远都无法被识别出来,编译器一直报错说我们的头找不到。
- 配置
c_cpp_properties.json
。打开方式就是我上面提到的。
在"includePath"
的值中添加头文件的路径。注意:值与值之间一定要加英文逗号,
隔开。
根据实际需要选择绝对路径和相对路径。
右键可以快速复制文件的路径。但是注意,includePath
里的值是头文件所在的文件夹路径,所以粘贴时要把复制下来的文件名删去。还要注意\
的转义符号为\\
。
修改完后的c_cpp_properties.json
如下所示:
图中马赛克部分是我的头文件路径。
上述方法需要在每个需要自定义头文件的程序配置中都设置一遍,对于频繁引用的头文件非常不友好。因此在这提供一种一劳永逸的方法二。
在C/C++配置面板中,我们找到包含路径,添加头文件所在文件夹,今后引用头文件的时候都会自动从这里的文件夹中寻找头文件,不需要再手动配置 c_cpp_properties.json
了。
- 配置
task.json
。在之前的步骤中我们已经生成了task.json
,现在只要去.vscode
文件夹打开它就可以。或者菜单“终端(T)”→“配置任务”也可以打开。
在"args"
中填入值"-i"
,并将写在c_cpp_properties.json
中的路径粘贴一份,同样注意逗号和转义字符的问题。这一步指示了预处理过程需要替换的内容的路径,预处理步骤将会生成后缀为.i
的文件。
这样就可以顺利地运行自定义的头文件啦!我的头又长回来了!
编码问题
在编译头文件的过程中,我的编译器报出 null character(s) ignored
的错误。排查后发现,是因为朋友发给我的头文件编码格式是 utf-16 le,而一般情况下,VS code文本编辑界面中字符是以 utf-8 进行编码的,如果用 Dev C++ 打开甚至会发现 utf-16 le 编写的英文字符都变成全角字符了。
此时,我们只要用记事本打开文档,在另存为的时候选择 utf-8 就可以解决问题了。