在 VS Code 中优化 C++ 开发环境

VS Code 默认的智能感知配置可能不够理想,无法像 CLion 那样进行变量类型的推导。为了改进这一点,尝试使用 Clangd 扩展来增强 VS Code 中的智能感知功能。既然都配置了 Clangd,那就顺便学一手 CMake 的简单配置,即配置 C++ 编译器,并使用 CMake 来构建项目。

环境配置信息

在开始之前,以下是我使用的设备和软件版本信息:

配置项 版本信息
macOS 14.1
xcode-select 2403
clang (arm) 15.0.0

安装必要工具和扩展

  1. 安装 xcode-select

    xcode-select 会附带安装 clang。虽然安装的 clang 版本可能不是最新的,但对于 C++ 20 的部分支持来说,Clang 15.0.0 已经足够了。

    xcode-select --install
    
  2. 安装 VS Code 插件

    • C/C++
    • Clangd
    • CMake
    • CMake Tools(安装 CMake 时会自动安装)

配置 Clangd

.vscode/settings.json 文件中添加以下配置,以启用并优化 Clangd 的智能感知功能:

"clangd.arguments": [
    "--background-index", // 启用智能感知后台索引
    "--compile-commands-dir=build", // 指定 compile_commands.json 文件的目录
    "-j=12", // 并发任务数量
    "--query-driver=/usr/bin/clang++", // clang++ 的路径
    "--clang-tidy", // 启用 clang-tidy
    "--clang-tidy-checks=performance-*,bugprone-*,portability-*,modernize-*", // 指定 clang-tidy 检查的范围
    "--all-scopes-completion", // 补全所有作用域
    "--completion-style=detailed", // 补全详细程度
    "--function-arg-placeholders", // 自动补全函数参数
    "--header-insertion=iwyu", // 头文件插入方式
    "--pch-storage=disk", // 预编译头文件的存储方式
]

配置 CMake

为了使用 CMake 构建项目,需要在 .vscode/settings.json 文件中进行如下配置:

"cmake.sourceDirectory": "${workspaceFolder}", // CMakeLists.txt 所在目录
"cmake.buildDirectory": "${workspaceFolder}/build", // 自定义构建目录
"cmake.configureSettings": {
    "CMAKE_RUNTIME_OUTPUT_DIRECTORY": "${workspaceFolder}/bin", // 可执行文件输出目录
}

配置 CMakeLists.txt

创建 CMakeLists.txt 文件,并配置项目信息和 C++ 版本:

cmake_minimum_required(VERSION 3.10) # 兼容版本配置
project(C++Learning VERSION 0.1.0 LANGUAGES C CXX) # 项目名称和版本

set(CMAKE_CXX_STANDARD 20) # 配置 C++ 版本为 C++ 20

include(CTest)
enable_testing()

add_executable(C++Learning main.cpp) # 定义可执行文件和源文件

include(CPack)

优化代码风格

从 Google 代码风格更换为 LLVM 代码风格,并将缩进设置为 4。创建 .clang-format 文件并放置于项目根目录:

BasedOnStyle: LLVM
IndentWidth: 4

示例代码

#include <algorithm>
#include <iostream> // 包含用于输入/输出操作的头文件 (cin, cout)
// #include <ranges>  // 此示例中未使用(用于基于范围的排序,可选)
#include <vector> // 包含 std::vector 定义的头文件

template <typename T>
concept 可排序 = requires(T t) { // 概念,用于检查类型是否可排序
    std::ranges::sort(t); // 要求:类型必须兼容 std::ranges::sort
};

void 排序并打印(可排序 auto &容器) { // 对可排序容器进行排序并打印的函数
    std::ranges::sort(容器);         // 使用 std::ranges::sort 排序容器
    for (const auto &元素 : 容器) {
        std::cout << 元素 << ' ';
    }
    std::cout << '\n';
}

int main() {
    std::vector<int> 数字 = {5, 3, 1, 2, 4};
    
    排序并打印(数字);

    return 0;
}

按下即可执行,调试也是如此,Enjoy~