参考文章:

在今年的秋招中,因为受之前米家游戏的影响,因此想去猛盒游这边投投简历试试水 —— 当然投的是前端开发的岗位。不出意外的,简历初筛过了,拿到了海笔的资格。

但当我打开试卷时,我傻眼了 —— 2025 秋招 - 程序通卷。这也就意味着,所有开发岗都做的是同一套卷子。

果不其然,打开后的第一道题目便是:

class ResourceManager {
private:
    int* data;
public:
    ResourceManager() {
        data = new int[10];
        std::cout << "Resource allocated\n";
    }
    ~ResourceManager() {
        delete[] data;
        std::cout << "Resource deallocated\n";
    }
};
int main() {
    ResourceManager rm;
    return 0;
}
  1. 运行结果是什么?
  2. 如果在构造函数中发生异常,会有什么问题?如何改进代码以避免资源泄漏?

哦,真就默认所有写代码的全都会 C++ 了是吧?

基本上只对 JS/TS 熟悉的我,自然基本上交了白卷,更不用说后面那一堆难的变态的算法题了。该说海笔不愧是海笔,我估计基本上就没有太想招人的意思,发了发试卷给我们做做而已。

不过,我也开始思考:C 是大一刚进来就学的东西,现在写算法题又基本上都用 C++,而且作为一门历史悠久的语言,它的手动内存管理以及更接近硬件本质的语法和编译,作为一名技术人应该都要好好学习一下并掌握。

而且随着 wbsm 技术的流行,一堆的前端库都用 Rust 进行编写, V8 引擎本身也是用 C++ 来编写的。技多不压身,多学一点、多了解一点总没坏处。

呃,所以我开始学 C++ 了。

好,接下来进入正题。作为一个写前端的,vscode 绝对是最常用的编辑器,自然写 C++ 也会想保留自己的使用习惯。那么怎么在 vscode 里面配置 C/C++ 调试环境呢?

# 安装 MinGW-w64

MinGW-w64Minimalist GNU for Windows 的一个扩展版,是一个开源的 Windows 平台的开发工具集,主要用于在 Windows 上构建和运行基于 GNU 工具链(如 GCC)的应用程序。相比原始的 MinGW 项目,MinGW-w64 增强了对 64 位 Windows 的支持,并提供了更多的功能和改进。换句话说,你想要在 Windows 上面编译 C/C++,必须得安装这个工具集。所以安装它是必要的一个步骤,如果安装过了可以跳过!

# 安装并解压最新版本

前往 https://github.com/niXman/mingw-builds-binaries,找到 Releases。这里包含了所有最新版本的构建好的 MingGW-w64 二进制文件,选择你需要的版本下载即可。

image-20241128105727662

对于这些特定的后缀名称代表了各个不同的版本。我们如果是在一般的 win11 机器上面安装的话,一般下载 posix-seh-ucrt 就可以了,如果有其他的需求可以自己搜索。

下载之后是一个压缩包,解压到你认为合适的位置。比如我自己是解压到 D:\MinGW\mingw64 这个目录下面。

# 添加环境变量

win+R 输入 sysdm.cpl 打开系统属性,选中 “高级” 再打开 “环境变量”,找到 “系统变量” 的 Path 变量,点击编辑之后新建 D:\MinGW\mingw64\bin 并确定。 \bin 目录里面包含了很多 C++ 的编译器。

添加完成后,打开 powershell,输入 gcc --version 来看看是否有输出版本相关信息。

image-20241128110909421

如果有输出,那么就说明 MinGW 已经安装成功了,可以进行 vscode 的环境配置了!

# vscode 配置

# C/C++ 插件

创建一个你想使用 C++ 开发的空目录,用 vscode 打开,前往插件商店里面搜索并安装 C/C++ 插件。

image-20241128111648761

然后 Ctrl + Shift + P 打开快捷指令,向其中输入 C/C++ Edit Configurations 并选择第一个选项进入插件设置界面。以下是需要用户自己设置的一些配置选项:

  1. 配置名称:

    如果你是 Win11,设置为 Win32 即可,如果是其他的系统就根据自己的实际情况设置。

  2. 编译器路径:

    就是我们上面讲的 MinGW 安装路径, \bin 目录下面有非常多的编译器供选择。如果是编译 C/C++ 代码,我们会使用 gcc / g++

    如果你是纯 C++ 项目,推荐选择 g++ 编译器;如果是 C/C++ 混合项目或者是纯 C 项目,推荐选择 gcc 编译器

    如果纯 C++ 项目仍然想要使用 gcc 进行编译,需要手动为编译行为添加连接 C++ 标准库的参数。 比如你有一段要编译的 C++ 代码 main.cpp ,使用 g++ 编译的命令可能为:

    g++ -fdiagnostics-color=always -g main.cpp -o main.exe

    使用 gcc 编译的命令就需要为:

    gcc -fdiagnostics-color=always -g main.cpp -o main.exe -lstdc++
  3. 编译器参数:

    正如上面所说的,如果你对你的编译命令有特殊的参数要求,可以在这里添加。每行输入一个参数

  4. IntelliSense 模式

    编写 C/C++ 的时候的智能感知模式。我们一般选择 windows-gcc-x64 即可。

  5. C/C++ 标准

    C 标准一般选择 C17,比较稳定而且新。看你个人选择。

    C++ 标准一般配合 C 标准选择 gnu++ 17 版本。

配置完成之后,会在你打开的这个目录下面自动创建一个 .vscode 的目录,里面有个 c_cpp_properties.json 文件,保存了你刚刚配置的信息。基本上你每次创建一个新 C++ 项目都得重新打开一遍插件的设置界面,即使你什么都不做它也会自动帮你创建好这个文件

# 创建编译任务

在你的这个目录下面新建一个 main.cpp 的文件,往里面输入一段初学者的代码:

#include <iostream>
#ifdef _WIN32
#include <windows.h>
#endif
using namespace std;
int main()
{
#ifdef _WIN32
  SetConsoleOutputCP(CP_UTF8);
#endif
  cout << "Hello, World!" << endl;
  return 0;
}

然后你会发现右上角的运行按钮会多了个 debug 的标识。我们点击下拉按钮,选择 “运行 C/C++ 文件”。

image-20241128113705803

我们选择第一个,就是刚刚通过配置插件配好的任务:

image-20241128113807604

稍微等一下之后,不出意外的话就会在你的控制台上面成功打印 “Hello World!” 字符串,说明你的配置是没问题的。

与此同时,会在你的 .vscode 目录下面生成一个 task.json 的文件,里面就是具体的任务配置信息。在接下来的调试配置中,我们就要使用这个任务配置的信息

到此为止,在 vscode 里面运行 C/C++ 的环境基本上 OK 了,接下来是调试配置。

# 创建调试配置

我们打开 vscode 左侧边栏的 “运行与调试” 按钮,点击 “创建 launch.json 文件” 按钮。

image-20241128114241941

选择下拉框的第一个建议选项。

image-20241128114314773

然后就会自动为你创建一个 launch.json 文件,不过里面是空的。

接下来,在 “configurations” 数组里面键入 “C”,会弹出一堆的预置配置项,我们选择 C/C++:(gdb)启动

image-20241128114457570

image-20241128114625820

我们要把里面的 programmiDebuggerPath 这两个配置项给改了。

  • program : 运行程序的完整路径。一般设置为: ${fileDirname}\\${fileBasenameNoExtension}.exe
  • miDebuggerPath : MI 调试程序 (如 gdb) 的路径。一般设置为你安装 MinGW 目录 /bin/gdb.exe 。对照我的: D:\\MinGW\\mingw64\\bin\\gdb.exe

设置完成之后,我们可以试着编写复杂点的程序来测试断点调试。我给出一个经典的二分查找的代码用于测试:

#include <iostream>
#ifdef _WIN32
#include <windows.h>
#endif
using namespace std;
class Solution
{
public:
  int binary_search(int arr[], int n, int target)
  {
    int left = 0, right = n - 1;
    while (left <= right)
    {
      int mid = left + (right - left) / 2;
      if (arr[mid] == target)
        return mid;
      else if (arr[mid] < target)
        left = mid + 1;
      else
        right = mid - 1;
    }
    return -1;
  }
};
void test()
{
  Solution solution;
  int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int n = sizeof(arr) / sizeof(arr[0]);
  int target = 5;
  int result = solution.binary_search(arr, n, target);
  if (result != -1)
    cout << "Element found at index " << result << endl;
  else
    cout << "Element not found in the array" << endl;
}
int main()
{
#ifdef _WIN32
  SetConsoleOutputCP(CP_UTF8);
#endif
  cout << "Hello, World!" << endl;
  test();
  return 0;
}

我们在 int mid = left + (right - left) / 2; 的地方打断点,之后启动调试:

C++调试演示

可以看到,能够准确的在断点位置停住并显示堆栈相关的内容。

至此,基本上开发前的准备工作都完成了,可以愉快的开始使用 vscode 编写 C/C++ 代码了!!

不过唯一有点不足的点就是,每次创建新项目都得重复一遍这样的操作有点繁琐。可以将常用的这几个文件都装到一个目录里面,新建项目的时候都复制一份就可以了!

希望这篇文章对你有所帮助~