Clang-tidy 实时静态检测需同时满足三个条件:clang-tidy.path 设为绝对路径、compile_commands.json 置于项目根目录、VSCode 中显式启用 clang-tidy.enabled 为 true;三者缺一不可。

Clangd 本身不执行静态检测,它只提供语义分析和基础诊断;真正的实时静态检测必须靠 clang-tidy 驱动,且必须满足三个硬性条件:正确路径、compile_commands.json 就位、VSCode 中显式启用。
clang-tidy.path 必须填绝对路径,不能依赖 PATH
VSCode 的 C/C++ 扩展(ms-vscode.cpptools)在调用 clang-tidy 时,会优先查 clang-tidy.path 设置项。留空虽会 fallback 到系统 PATH,但一旦 PATH 错误或存在多个版本,它就静默失败——不报错、不提示、不检测,连警告都没有。
- 在终端运行
which clang-tidy(Linux/macOS)或where clang-tidy(Windows),确认输出是真实可执行文件路径,例如:/usr/bin/clang-tidy或C:\Program Files\LLVM\bin\clang-tidy.exe - 不要填
clang-tidy-16这类带版本号的名称,除非你项目里.clang-tidy明确指定了该版本语义 - Homebrew 安装 LLVM 时,Apple Silicon 默认路径是
/opt/homebrew/bin/clang-tidy,Intel 是/usr/local/bin/clang-tidy,务必核对清楚
compile_commands.json 必须放在项目根目录,不能只靠 CMake 生成
clang-tidy 是基于 AST 的工具,必须知道每个源文件的完整编译命令(含 include 路径、宏定义、C++ 标准等),否则连 std::vector 都解析不了,直接跳过检查或大量误报。
- CMake 项目需在
CMakeLists.txt中开启:set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - 运行
cmake -B build -G "Unix Makefiles"(或其他 generator)后,build/compile_commands.json会被生成 - 必须手动把该文件 复制到项目根目录(即 VSCode 工作区打开的文件夹),C/C++ 扩展默认只从这里读取
- 验证是否生效:打开任意
.cpp文件,按Ctrl+Shift+P→ 输入C/C++: Show References to Symbol at Cursor,能跳转到<iostream>等系统头才算成功
clang-tidy.enabled 必须手动设为 true,且 checks 要合理筛选
VSCode 默认禁用 clang-tidy,即使插件已装、路径已配、数据库已就位,它也只跑微软自己的 IntelliSense 引擎,完全不触发 clang-tidy。
立即学习“C++免费学习笔记(深入)”;
- 在
settings.json中添加这两项: "clang-tidy.enabled": true"clang-tidy.checks": ["-*", "modernize-*", "cppcoreguidelines-*", "performance-*"]- 用
-*先清空所有默认规则,再显式启用你需要的;避免盲目开--enable=all导致大量噪声 - 加
"clang-tidy.headerFilterRegex": ".*"可控制扫描范围,比如设为"^src/.*"就只检查自己代码,跳过第三方库
clangd 和 clang-tidy 不是同一个进程,配置不能混用
很多人以为配好 clangd.arguments 就等于配好了 clang-tidy,这是典型误区。两者完全独立:clangd 是语言服务器,负责补全/跳转/重命名;clang-tidy 是独立 CLI 工具,由 C/C++ 扩展在后台调用。
-
clangd.arguments里的--compile-commands-dir只影响clangd自身行为,对clang-tidy无效 -
clang-tidy不读.clangd或config.yaml,它只认.clang-tidy文件(项目级)或clang-tidy.checks(VSCode 级) - 如果你用
.clang-tidy文件,记得它必须放在项目根目录,且格式是 YAML,例如:Checks: '-*, modernize-loop-convert'
最容易被忽略的一点:clang-tidy 的诊断是“延迟触发”的——它不会在你敲下第一个字符时立刻报错,而是在文件保存、光标离开当前函数、或 VSCode 主动刷新语义时才拉起进程分析。这意味着修改代码后没立刻看到提示,不等于没生效,多等一两秒再看状态栏右下角是否有 Tidy 图标闪烁。


















