C Programming

Courses

Windows 上配置 VS Code 编写 C 程序

Resources

本页面向 Windows 10/11 的 64 位电脑,从未安装 Visual Studio 的情况开始。完成后,你可以在 VS Code 中编写 .c 文件,用 GCC 编译、运行程序,并用 GDB 设置断点。这里使用 MSYS2 的 UCRT64 工具链 ;VS Code 负责编辑,C/C++ 扩展负责编辑辅助和连接调试器,它们本身不提供 C 编译器。

下文默认 MSYS2 安装在 C:\msys64。如果你选择了其他目录,后面的路径都要相应修改。本页的 VS Code 配置适用于单个 .c 文件;多个源文件需要单独设置构建方式。

1. 下载并安装 VS Code 和必需插件

从 VS Code 官网 下载 Windows 安装程序,运行安装程序并完成安装。

然后安装本指南要用的插件 C/C++(Microsoft) ,其扩展标识是 ms-vscode.cpptools:

  1. 打开 VS Code,按 Ctrl+Shift+X 进入“扩展”(Extensions)。
  2. 在搜索框输入 C/C++,找到发布者为 Microsoft 的 C/C++,单击“安装”(Install)。请核对名称和发布者,不要只凭图标选择同名扩展。
  3. 安装结束后,在扩展详情页确认显示“已启用”(Enabled)。如果界面提示重新加载窗口,按提示操作。

这个扩展提供 C 代码提示和本页使用的 cppdbg 调试配置。编译和实际调试还需要下一步安装的 GCC、GDB;只安装插件,VS Code 还不能运行 C 程序。

2. 下载并安装 GCC、GDB

  1. 从 MSYS2 官网 下载 Windows 安装程序,运行安装程序,安装到默认目录 C:\msys64。

  2. 安装结束后打开 MSYS2 UCRT64 终端。以下 pacman 命令在这个终端中运行,不要输入到 PowerShell。

  3. 先更新 MSYS2:

    pacman -Suy
    

    如果更新要求关闭终端,就关闭并重新打开 MSYS2 UCRT64,再运行一次 pacman -Suy,直到更新完成。

  4. 安装 UCRT64 工具链。出现软件包选择时直接按 Enter 接受默认选择,出现确认提示时输入 Y:

    pacman -S --needed mingw-w64-ucrt-x86_64-toolchain
    

    这个工具链包含本页要用的 gcc.exe 和 gdb.exe。MSYS2 软件包列表 列出了其组件。

3. 配置编译器路径

在 Windows 开始菜单搜索“编辑账户的环境变量”(也可搜索 Edit environment variables for your account)。打开用户变量中的 Path,新建一项:

C:\msys64\ucrt64\bin

保存后完全退出并重新打开 VS Code,再在 VS Code 中选择“终端 → 新建终端”。以下命令在新终端中运行;本页以 PowerShell 终端为例:

gcc --version
gdb --version
where.exe gcc
where.exe gdb

前两条应显示版本信息;后两条应找到 C:\msys64\ucrt64\bin 下的程序。如果出现“找不到命令”,先检查 Path 是否写到了 ucrt64\bin、工具链是否安装成功,并重新打开 VS Code。不要把 C:\msys64\usr\bin 当作这里的编译器目录。

4. 编译并运行第一个 C 程序

新建一个文件夹,例如 C:\c-course\first-program,在 VS Code 中选择“文件 → 打开文件夹”打开它。新建并保存 hello.c:

#include <stdio.h>

int main(void)
{
    int a = 2;
    int b = 3;
    int sum = a + b;
    printf("sum = %d\n", sum);
    return 0;
}

打开 VS Code 终端。终端当前位置应是刚才打开的文件夹,然后执行:

gcc -std=c11 -Wall -Wextra -g -O0 hello.c -o hello.exe
.\hello.exe

看到 sum = 5,说明编译和运行成功。第一条命令把 hello.c 编译成 hello.exe;-g 保留调试信息,-O0 便于观察源代码的执行。修改源码后要重新编译,否则运行的仍是旧程序。

5. 配置 VS Code 的构建和调试

在刚才打开的文件夹中创建 .vscode 子文件夹,再创建以下两个文件。它们属于这个练习文件夹,不需要放到 VS Code 的安装目录。

.vscode/tasks.json:编译当前 .c 文件

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "C/C++: gcc.exe build active file",
      "type": "process",
      "command": "C:\\msys64\\ucrt64\\bin\\gcc.exe",
      "args": [
        "-std=c11",
        "-Wall",
        "-Wextra",
        "-g",
        "-O0",
        "${file}",
        "-o",
        "${fileDirname}\\${fileBasenameNoExtension}.exe"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

保持 hello.c 为当前打开的编辑器文件,选择“终端 → 运行生成任务”(Terminal → Run Build Task,快捷键 Ctrl+Shift+B),再选择 C/C++: gcc.exe build active file。构建成功后,可在终端运行 .\hello.exe。如果 MSYS2 安装在其他位置,修改 command 中的路径。

.vscode/launch.json:运行并调试

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C/C++: gcc.exe build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
      "args": [],
      "cwd": "${fileDirname}",
      "stopAtEntry": false,
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "C:\\msys64\\ucrt64\\bin\\gdb.exe",
      "preLaunchTask": "C/C++: gcc.exe build active file"
    }
  ]
}

6. 通过 VS Code 菜单运行和调试

先保存 hello.c,并让它成为当前打开的编辑器文件。在左侧活动栏打开“运行和调试”(Run and Debug),将顶部的配置选为 C/C++: gcc.exe build and debug active file。下面的两种启动方式共用这个 launch.json 配置;其中的 preLaunchTask 会在启动程序前执行 GCC 构建任务。不用另建一个“不调试运行”配置。

运行程序:不进入调试器

在顶部“运行(Run)”菜单中选择 Run Without Debugging(不调试运行,快捷键 Ctrl+F5)。第一次出现配置选择列表时,即使选项名称含有 debug,仍选择 C/C++: gcc.exe build and debug active file。如果同时看到 Detected Task 和 Default Configuration,这里也选择前述 launch configuration。VS Code 会先编译,再直接运行程序,不会停在断点。

观察 VS Code 下方的集成终端:构建成功后,程序输出 sum = 5。例如把 b = 3 改为 b = 4、保存并再次通过菜单运行,应看到 sum = 6。这样也能检查每次运行前是否编译了新代码。

调试程序:在断点查看变量

  1. 把示例中的 b 改回 3 并保存。在 printf 所在行的行号左侧单击,出现红点表示断点已设置。
  2. 在顶部“运行(Run)”菜单中选择 Start Debugging(启动调试,快捷键 F5)。如果弹出配置选择,仍选 C/C++: gcc.exe build and debug active file。构建完成后,程序会在 printf 行暂停。
  3. 在“运行和调试”侧栏的“变量”(Variables)中查看 a = 2、b = 3 和 sum = 5。把鼠标移到代码中的 sum 上,也可以查看当前值。
  4. 在调试工具栏单击“单步跳过”(Step Over,F10)执行 printf,在集成终端看到 sum = 5;再单击“继续”(Continue,F5)让程序结束。需要提前结束调试时,在“运行(Run)”菜单中选择 Stop Debugging(停止调试,Shift+F5)。

externalConsole: false 让程序在 VS Code 的集成终端中运行。后续使用 scanf 的程序也在该终端输入数据。

记住:F5 = 编译并调试;Ctrl+F5 = 编译并直接运行。 两者使用同一个配置,只是启动方式不同。

遇到问题时先检查

  • gcc 或 gdb 找不到: 返回第 3 步;运行 where.exe gcc 和 where.exe gdb,核对是否指向 UCRT64 目录。
  • F5 提示找不到 cppdbg 调试器: 返回第 1 步,检查 Microsoft 的 C/C++ 扩展是否已安装并启用。
  • 按 F5 时提示找不到程序: 确认当前打开的是已保存的 .c 文件,并先按 Ctrl+Shift+B 检查编译错误。preLaunchTask 的文字必须与 tasks.json 中的 label 完全一致。
  • 断点不停下或变量看不到: 确认按 F5 启动的是 C/C++: gcc.exe build and debug active file,编译参数中有 -g,且断点设在可执行的代码行。Ctrl+F5 会直接运行,不会在断点暂停。修改源码后重新启动调试。
  • 程序结果不对: 先确认本次编译成功,再查看常见错误 。

更多界面说明可参考 VS Code 的 MinGW 配置教程 和调试配置说明 。官方示例主要使用 C++ 的 g++;本页为课程中的 .c 文件使用 gcc。