Skip to content

使用Visual Studio Code进行C/C++单文件编程(Windows系统)

背景

南京大学硕士夏令营机试开始之前,某人打开124机房的古董电脑上的vscode,简单写了个hello world,结果发现VSCode对着#include <bits/stdc++>报错"header not found"。(解决方法见下文)

机试开始,某人想调试代码,却发现gdb不太好使。

一切都结束之后,某人翻经验贴仓库,发现有相似问题的不只某人一个。

前置条件

  • 电脑上有MinGW
  • 电脑上有Visual Studio Code
  • vscode上有Microsoft官方的C/C++插件

测试环境

  • Win11 22H2
  • Visual Studio Code 1.83.0
  • DevC++ 5.11自带的MinGW,其中g++版本为4.9.2,gdb版本为7.8.1(为了模拟124古董机器的编译器)

使用方法

新建文件夹,用vscode打开,之后的所有操作都在该窗口中进行。

C/C++ Configuration

按F1键,显示搜索框,输入C/C++,选择C/C++: Edit Configurations(UI),将会出现新页面C/C++ Configurations,同时.vscode文件夹下出现新文件c_cpp_properties.json。

以下内容需要修改:

使用C/C++ Configurations页面编辑时,不能打开c_cpp_properties.json文件,否则进行的编辑将不被保存。

{width=75%}

这个是编译器路径,更改方式有如下两种:

  1. 点击右侧箭头,打开下拉菜单,选择MinGW的g++(适用于g++在PATH中的情况)
  2. 直接输入g++的路径,注意不要带引号

VSCode的编译器寻找顺序为MSVC -> GCC on WSL -> MinGW, 所以当电脑上有MSVC时默认编译器路径是MSVC路径,这是124机房电脑的vscode不认识#include <bits/stdc++>的原因。

{width=75%}

在框中输入编译器参数,每行一个。

某人一般使用:

-Wall
-Wextra
-Wconversion
-Wshadow
-std=c++11

其中-Wconversion是类型转换警告,-Wshadow是变量重名覆盖警告(某人经常犯变量重名错误,因此习惯加上),-std=c++11为c++版本。

{width=75%}

这个选择windows-gcc-x64。

{width=75%}

这个是c和c++的版本,按需选择。

我用上述编译器版本测试,即使在C++ standard中选择了c++11,在编译带c++11特性的代码时仍报错,解决方案是在编译参数中加上-std=c++11

编写代码

没啥说的,在自己创建的文件夹里新建c/c++文件写就完了。

运行/调试

现在.vscode文件夹下只有c_cpp_properties.json一个文件。

tasks.json(必需)

将vscode页面切换到想要运行的代码文件,右上角如图所示:

{width=25%}

点击下拉菜单,选择debug或run

{width=25%}

会出现一个菜单

{width=50%}

选择想要的编译器路径,选择完后.vscode文件夹下应出现tasks.json。

然后再点击debug C/C++ File或Run C/C++ File,就有可能可以正常运行或调试程序了。

正常情况下vscode会自动新建两个terminal,一个用于编译,一个用于运行。

使用快捷键ctrl+j打开panel,下面这个终端是编译用的,与我们无关:

{width=50%}

下面这个终端是运行程序的,我们在这里输入数据:

{width=50%}

注意到panel里面还有一个debug console,调试时我们可以在里面输入式子。

如果还不能正常使用,请看下节launch.json。

launch.json(非必需)

我使用DevC++自带的gdb7.8.1测试时,用vscode的集成终端无法输入数据,换成gdb13.2则没有此问题。解决方法是在launch.json中把"externalConsole"false改为true,使用外部终端。 但这样外部终端会一闪而过看不见输出,解决方法: - 在代码的main函数的return 0;前面加上system("pause");在OJ提交时去掉这行。 - 运行程序时选择debug c/c++ file按钮,设置断点

自动配置

点击右上角的齿轮图标,顶部会出现一个菜单

{width=50%}

选择第一个Recently Used Task,.vscode下将会自动生成一个launch.json

手动配置

页面切换至c/c++代码文件,点击侧边栏的 Run and Debug,点击create a launch.json file。

{width=25%}

在弹出的菜单中选择C++(GDB/LLDB),然后将生成一个新文件launch.json。初始如图所示:

{width=50%}

点击右下角的 Add Configuration,选择 C/C++: (gdb) Launch。

然后将插入以下内容:

{width=50%}

其中"program"和"miDebuggerPath"是一定要改的。打开tasks.json,看到 args的-o后面有一行"${fileDirname}\\${fileBasenameNoExtension}.exe",把program后面的内容改成这个。"miDebuggerPath"就是gdb的路径,注意在windows下要使用双反斜杠,最后形如这样:

"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"miDebuggerPath": "C:\\Program Files (x86)\\Dev-Cpp\\MinGW64\\bin\\gdb.exe",

配置完之后再点击右上角的run/debug按钮,不出意外应该可以正常运行。

参考资料

Using GCC with MinGW

C/C++ for Visual Studio Code

Debug C++ in Visual Studio Code