在 VS Code 中优化 C++ 开发环境
VS Code 默认的智能感知配置可能不够理想,无法像 CLion 那样进行变量类型的推导。为了改进这一点,尝试使用 Clangd 扩展来增强 VS Code 中的智能感知功能。既然都配置了 Clangd,那就顺便学一手 CMake 的简单配置,即配置 C++ 编译器,并使用 CMake 来构建项目。
环境配置信息
在开始之前,以下是我使用的设备和软件版本信息:
配置项 | 版本信息 |
---|---|
macOS | 14.1 |
xcode-select | 2403 |
clang (arm) | 15.0.0 |
安装必要工具和扩展
-
安装 xcode-select
xcode-select 会附带安装 clang。虽然安装的 clang 版本可能不是最新的,但对于 C++ 20 的部分支持来说,Clang 15.0.0 已经足够了。
xcode-select --install
-
安装 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~