0.测试环境
1.Microsoft Windows [版本 10.0.19044.2604]
2.Visual Studio Code[版本1.76.0]
1. 简介
使用Visual Studio Code(以下简称vs code)进行c/c++开发,需要以下几个步骤:安装Mingw-w64、安装插件、设置插件、调试例程等步骤。本文将详细介绍每个步骤的具体操作方法。测试环境如上所示。
配置完成后可以实现vs code开发c/c++项目,支持c++20、c++23和c20、c23等语言标准。
如需进行其他语言开发,请参考:[[配置VSCode]] 、等。
2.安装Mingw-w64
2.1 安装软件
方法一:可以通过msys2下载安装Ming-w64的最新版本。
1.先访问MSYS2网站下载msys2软件,或直接点击链接msys2软件下载,并安装。
2.根据MSYS2网站的安装指南下载安装Ming-w64及Mingw-w64 toolchain。
3.以后随时可以通过msys2软件指令更新Ming-w64到最新版本。
方法二:直接访问Ming-w64的官方网站下载最新版本并手动安装。
1.直接访问Ming-w64的官方网站下载ming-w64-builds最新版本(
x86_64-12.2.0-release-posix-seh-msvcrt-rt_v10-rev2.7z)。
2.解压缩所下载的软件包,得到一个目录
ming-w64,将该目录移动到
c:\或者
c:\tools\下。
笔者推荐使用第一种方式。
2.2 path配置
将 ming-w64软件包的目录( c:\mingw64\bin)添加到系统环境变量 PATH中,安装到其他目录的对应修改。
2.3 测试
在CMD窗口用以下指令测试安装和PATH设置是否成功,正常显示版本信息表示成功。
gcc --version
g++ --version
gdb --version
3.安装插件
只需安装插件包 C/C++ Extension Pack即可,它包含以下三个插件: c/c++、 c/c++ Themes和 CMake Tools。
千万不要安装 clangd插件,目前该插件对c++20、c++23语言标准特性只有部分支持,安装启用后,会对使用新特性的代码报错,且无法通过编译。并且其功能与Microsoft的 c/c++插件是重复的,像代码补全等功能 c/c++插件实现得更好。

4.设置插件
在插件窗口找到 c/c++插件,点击齿轮配置图标,在弹出的菜单中点击 Extension Settings,打开配置界面。设置代码补全功能和c/c++标准等参数。

依次将相关配置项配置为如图所示的值。 C_Cpp:Autocomplete设置为 default, C_Cpp:Autocomplete Add Parentheses设置为 选中状态, C_Cpp:Code Folding设置为 enabled, C_Cpp:Configuration Warnings设置为 enabled。

C_Cpp:Default:Cpp Standard设置为
c++23,
C_Cpp:Default:C Standard设置为
c23,
C_Cpp:Default:Enable Configuration Squiggles选项保持
选中。

C_Cpp:Default:Intelli Sense Mode设置为
windows-msvc-x64。这是c++代码编辑窗口代码自动补全的设置,操作系统和安装环境不同的设置为其它相应的值。

其它代码补全的相关设置如图设置。



C_Cpp:Suggest Snippets选项保持
选中,其余选项按需设置即可。

5.调试例程
5.1 在CMD窗口创建工作目录
1 2 3 4 5 6 7 |
mkdir projects cd projects mkdir helloworld cd helloworld code . |
最后一条指令 code .会在当前工作目录打开 VS Code,这个工作目录就是工作区( workspace)。在 Workspace Trust dialog内选择 Yes, I trust the authors选项。
5.2 新建源代码文件
在文件资源管理器标题栏中,选择“新建文件”按钮并将文件命名为 : helloworld.cpp
5.3 添加helloworld源代码
将以下代码复制粘贴到helloworld.cpp文件中,按 ctrl+S保存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#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; } |
5.4 调试运行程序
调试运行c++程序,需要在工作区内创建.vscode文件夹(系统自动生成),并在该文件夹内创建一些配置文件(也是系统自动生成):
- tasks.json (build instructions) //构建说明(用于以非调试模式运行程序时)
- launch.json (debugger settings) //调试器参数设置(用于调试模式运行程序时)
- c_cpp_properties.json (compiler path and IntelliSense settings) //编译路径和代码补全的设置(该文件可选,是不使用CMake工具的项目保存项目设置参数用,使用CMake工具的项目将相关参数保存在文件 CMakeSettings.json,一般可不用)
- settings.json //(该文件可选,是针对具体的项目需要制定特殊的设置参数时使用,一般可不用)
一般情况,只需前两个文件,配置好参数以后,再新建项目时可直接复制.vscode文件夹到新项目文件夹里(根据项目需要可自行修改相关参数)即可。
5.4.1 创建 task.json文件
在源代码文件helloworld.cpp打开的情况下,按
F5键或者点击
运行(R)菜单的
启动调试菜单项,弹出如下窗口:

选择第一项,Vs Code会自动在当前目录下的.vscode子目录(如不存在则自动生成该目录)下生成task.json配置文档(仅首次生成,以后选择其他项时为修改文档增加相应的调试器配置)并自动启动调试,文档内容如下:

调试时屏幕工作区相关布局如下,在终端窗口可以看到程序已经调试运行并正常输出了结果:

前面启动调试菜单项中,出现了系统找到的6款编译器,经测试,其中 cpp.exe和 clang-cpp.exe生成的程序为16位,无法在当前主流的64位系统下运行。 clang-cl.exe目前不支持c++20及以上版本。
5.4.2 创建 launch.json文件
点击左侧工具条的
运行和调试图标,打开
运行和调试窗口,点击
创建launch.json文件可创建
launch.json文件,可以自定义运行和调试相关参数。

出现选择调试器的窗口,建议选择第一个
C++(GDB/LLDB)。

点击
C++(GDB/LLDB)后创建
launch.json文件(仅首次创建,以后为在该文件中添加相关内容)并打开它:

此时配置文件为没有调试器配置参数的空的模板文档,点击文件内容窗口右下角的 添加配置按钮,出现Vs Code识别出的当前系统内可供选择的调试器,可根据需要选择:
5.4.2.1 创建 (gdb) Windows 上的 Bash 启动调试器参数
本次选择第一个
(gdb) Windows 上的 Bash 启动。
(注:此处的选择为错误的选择)

系统会自动将该调试器的参数配置添加到launch.json文档的配置列表
"configurations"中,请注意系统自动生成的该调试器的配置参数有一处需要手动修改,即
"program"参数,请将其值由
"输入程序名称,例如 ${workspaceFolder}/a.exe"修改为实际的程序名称,可使用系统变量,本处可设为:
"${fileDirname}\\${fileBasenameNoExtension}.exe"。按ctrl+S保存修改。

关闭
launch.json文档,打开
helloworld.cpp源代码文档,点击
运行(R)菜单或者按
F5键启动调试。出现报错界面如下:

报错信息提示找不到 bash.exe文件,经查找核实本机确实没有 bash.exe文件(这是linux/unix操作系统下的shell命令)。
5.4.2.2 创建 C++:(gdb) 启动调试器参数
点击 打开"launch.json"按钮,再次点击文件内容窗口右下角的 添加配置按钮,出现Vs Code识别出的当前系统内可供选择的调试器,可根据需要选择,本次选择第三个。
选择第三项: C++:(gdb) 启动,系统会自动将该调试器的参数配置添加到launch.json文档的配置列表 "configurations"中,请注意系统自动生成的该调试器的配置参数有两处需要手动修改:

一是 "program"参数,请将其值由 "输入程序名称,例如 ${workspaceFolder}/a.exe"修改为实际的程序名称,可使用系统变量,本处可设为: "${fileDirname}\\${fileBasenameNoExtension}.exe"。
二是 "miDebuggerPath"参数,其值由 /path/to/gdb/改成gdb文件所在路径,本处可设为: "C:\\MinGw64\\bin\\gdb.exe"。
按ctrl+S保存修改。修改后的内容如下:

关闭lanuch.json文件,从资源管理器窗口打开 helloworld.cpp源代码文件。点击左侧工具条的 运行和调试图标,打开 运行和调试窗口,在顶部的调试器下拉框单击打开下拉列表,选择 (gdb)启动,点击下拉框左侧的三角形图标(或者按 F5键),启动调试。

调试输出如下:

可以在源代码程序内根据需要自行设置断点,再次启动调试。(调试程序的相关说明请参考有关文档)
5.4.2.3 创建 (Windows)启动调试器参数
可根据需要依次测试添加其他的调试器,本次添加 (Windows)启动调试器参数。注意其中的 "program"参数,请将其值由 "输入程序名称,例如 ${workspaceFolder}/a.exe"修改为实际的程序名称,可使用系统变量,本处可设为: "${fileDirname}\\${fileBasenameNoExtension}.exe"。修改后的调试器参数如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "name": "(Windows) 启动", "type": "cppvsdbg", "request": "launch", "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "console": "externalTerminal" } |
用 (Windows)启动调试器调试helloworld.cpp程序,运行界面如下:

5.4.3 C++20标准特性测试
在上述helloworld.cpp文档中加入两行代码:
1 2 3 4 5 |
#include <numbers> ... cout << numbers::pi << endl; |
注:numbers库为C++20新支持的特性。
在代码输入界面可正常显示代码完成的提示信息,如下图所示:

输入完毕后,鼠标滑动到
pi上方时编辑器自动显示相关信息如下,说明编辑器已经支持了
C++20标准的新特性。

按 ctrl+S键保存代码,点击左侧工具条的 运行和调试图标,打开 运行和调试窗口,按 F5键启动调试,出现报错信息,源代码文件相应的代码行出现红色波浪线指示,说明调试器目前不支持该 C++20标准的新特性。

5.4.3.1 修改 launch.json文件
打开
launch.json文件,将每个调试器的
"args":[ ]修改为
"args": ["-std=c++23"],,按
ctrl+S键保存。

关闭该文件,再次启动运行和调试,发现程序已运行正常,并能按预期打印PI的值。

请注意, clang.exe类编译器(包括 clang.exe, clang++.exe)的参数要用 c++2a来代替 c++20,用 c++2b来代替 c++23。但 clang-cl.exe编译器目前不支持 c++2a/c++2b/c++20/c++23。
5.4.3.2 修改 task.json文件
打开 task.json文件,针对每个任务的 “args”参数列表,添加下面这行参数,并保存修改。
1 2 3 |
"-std=c++23", |

再次在 运行和调试窗口,选择对应的任务来生成执行文件,发现程序运行正常。
请注意, clang.exe类编译器(包括 clang.exe, clang++.exe)的参数要用 c++2a来代替 c++20,用 c++2b来代替 c++23。但 clang-cl.exe编译器不支持 c++2a/c++2b/c++20/c++23。
5.4.4 关于Makefile
我们在使用Vs code运行和调试cpp(c++)程序时,总是经常出现恼人的“ 未找到Make”、“ 找不到Makefile入口点”的报错信息。

如何解决请参阅:VS Code调试Cpp程序时报“未找到Make”错误问题。
6.参考信息
6.1. VS Code官网
Get Started with C++ and Mingw-w64 in Visual Studio Code
This is a demo advert, you can use simple text, HTML image or any Ad Service JavaScript code. If you're inserting HTML or JS code make sure editor is switched to 'Text' mode.