## 一、clangd

### 1. LLVM 简介

先来了解一下 LLVM。LLVM 是什么？官网在这里：[The LLVM Compiler Infrastructure Project](https://llvm.org/)

LLVM（最初是 **Low Level Virtual Machine** 的缩写，但现已不强调全称）是一个开源的 **编译器基础设施项目**，旨在为编程语言提供模块化、可重用的编译和优化工具链。LLVM 是一个编译器（确切的说是一套框架+基于框架的一些编译器实现，如 clang），是当下很先进的一套编译系统。特别对于 C/C++/Objective-C 等语言而言，更是如此，广泛应用于静态编译、动态编译（JIT）、代码优化、代码生成等领域。

### 2. clangd 简介

clangd 是一个基于 Clang 的语言服务器，它实现了语言服务器协议（LSP），可以为编辑器（如 VS Code、Vim、Emacs 等）提供 C/C++ 的智能代码编辑功能，例如自动补全、转到定义、查找引用、代码重构和实时诊断等。clangd 以独立守护进程的方式运行，通过 LSP 与编辑器通信，为开发者提供类似 IDE 的体验。

它的官网在这里：[What is clangd?](https://clangd.llvm.org/)

### 3. clangd 安装

我这里装的是 19.1.2 版本（linux）：[Releases · clangd/clangd](https://github.com/clangd/clangd/releases/tag/19.1.2)

<img src="./LV515-C与C++开发/img/image-20250519004642888.png" alt="image-20250519004642888" />

### 3. clangd for vscode 扩展

#### 3.1 扩展安装

- Github：[GitHub - clangd/vscode-clangd: Visual Studio Code extension for clangd · GitHub](https://github.com/clangd/vscode-clangd)
- VSIX 下载

```shell
vscode-clangd:
  publisher: llvm-vs-code-extensions
  extension: vscode-clangd
  version: 0.1.33
  vsix-url: https://marketplace.visualstudio.com/_apis/public/gallery/publishers/llvm-vs-code-extensions/vsextensions/vscode-clangd/0.1.33/vspackage
```

> 主要是装在服务器中。

#### 3.2 扩展配置

打开远程配置文件：

<img src="./LV515-C与C++开发/img/image-20250519004909604.png" alt="image-20250519004909604" />

然后添加以下内容：

```json
{
    // llvm-vs-code-extensions.vscode-clangd
    "clangd.arguments": [
		"--log=verbose",
		"--clang-tidy",
		"--clang-tidy-checks=cppcoreguidelines-*,performance-*,bugprone-*,portability-*,modernize-*,google-*",
		"--compile-commands-dir=${workspaceFolder}",
		"--completion-style=detailed",
		"--background-index",
		"-j=16",
		"--all-scopes-completion",
		"--header-insertion-decorators",
		"--header-insertion=never",
		"--pch-storage=disk",
		"--function-arg-placeholders=false",
		"--cross-file-rename",
		"--enable-config",
		"--fallback-style=webkit",
		"--ranking-model=heuristics",
		"--pretty",
	],
	"clangd.path": "/home/sumu/2software/clangd_19.1.2/bin/clangd",
}
```

- "clangd.path"：就是在服务器端安装的 clangd 程序的目录。

- "--compile-commands-dir"：对应后续 compile_commands.json 文件位置，上面是配置为工程目录。

#### 3.3 工程配置

>参考资料：[Getting started](https://clangd.llvm.org/installation#project-setup)

要理解我们的源代码，clangd 需要知道我们的构建标志。（这只是 C++中的一个实际情况，源文件并非自包含的。）

默认情况下，clangd 会假设我们的代码是按照 `clang some_file.cc` 的方式构建的，这样我们可能会收到关于缺少 `#include` 文件等虚假错误。有几种方法可以解决这个问题：

- `compile_commands.json`：此文件提供项目中每个源文件的编译命令。它通常由工具生成，例如 bear。clangd 会在我们编辑的文件的父目录中查找它，也会在名为 `build/` 的子目录中查找。例如，若编辑 `$SRC/gui/window.cpp`，clangd 会在 `$SRC/gui/`、`$SRC/gui/build/`、`$SRC/`、`$SRC/build/` 等目录中搜索。
- `compile_flags.txt`：如果一个项目中的所有文件都使用相同的构建标志，我们可以将这些标志每行一个地放在源根目录下的 `compile_flags.txt` 中。Clangd 会假设编译命令为 `clang $FLAGS some_file.cc`。如果存在 `compile_commands.json`，此文件将被忽略。但是我们一般还是使用 `compile_commands.json`。

clangd 的使用需要工程中存在 compile_commands.json 文件，怎么生成呢？可以用 bear 命令生成。

```shell
# Makefile
bear make

# Cmake
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
```

但是有时候我们可能是用 shell 脚本控制编译，然后内部有很多个子 makefile，可以直接在脚本前加 bear：

```shell
sudo apt install bear # 没有安装的话，需要安装一下
bear ./build.sh -p1 -n2
```

生成之后，需要重启 clangd 服务（或重新打开远程），然后就可以用了。

## 二、Clang-Format

### 1. 是什么？

clang-format 是一个开源的代码格式化工具，它可以帮助程序员自动调整源代码的格式，以符合指定的编码风格规范。通过配置简单易懂的格式化选项，clang-format 可以在保持代码功能不变的情况下，自动处理缩进、空格、括号、逗号等细节，提高代码的可读性和一致性。无论是个人项目还是团队协作，clang-format 都是一个强大的工具，能够减轻代码审查和格式化的工作量，使代码维护更加高效。

> Tips：它利用 **clang 的词法分析器 (Lexer)** 将源代码拆分成一个个的 token（语法单元），然后根据规则重新组织这些 token 周围的空白字符，从而实现格式化。

Clang-Format 是 LLVM 项目中的一个 **独立工具**，存放在 `clang/tools` 目录下。它在技术上 **基于 clang 的词法分析器**（也就是复用了 clang 解析代码的能力）来理解和处理源代码。所以，clang 和 Clang-Format 就像 LLVM 家族中的两兄弟：clang 负责 "编译" 代码，而 Clang-Format 负责 "美化" 代码。它们都依赖于 LLVM 提供的基础设施。

### 2. Clang-Format for vscode 扩展

#### 2.1 简介

我们想要在 vscode 中使用 Clang-Format，就要先安装对应的 vscode 扩展，这个扩展主要在 VSCode 里做三件事：

- 在右键菜单或命令面板中添加“格式化文档”这样的选项。
- 监听我们的操作（比如按下保存快捷键 `Ctrl+S`），一旦触发格式化命令，它就去调用 Clang-Format 应用程序格式化代码。
- 它本身 **并不具备修改代码格式的能力**，只是一个帮我们调用外部工具的“界面”。

> 其实也可以不装这个扩展，自己敲命令一样可以达到目的。

#### 2.2 扩展安装

- Github：[GitHub - xaverh/vscode-clang-format: A Visual Studio Code extension that provides C++, C, Obj-C, Java formatting with the use of clang-format · GitHub](https://github.com/xaverh/vscode-clang-format)
- VSIX 下载

```shell
# https://marketplace.visualstudio.com/_apis/public/gallery/publishers/{发布者}/vsextensions/{插件名}/{版本号}/vspackage

https://marketplace.visualstudio.com/_apis/public/gallery/publishers/xaver/vsextensions/clang-format/1.9.0/vspackage
```

#### 2.3 扩展配置

放在后面写，点击这里直达：[扩展配置](#section1)

### 3. clang-format

#### 3.1 安装包安装

安装了 vscode 插件之后，还是个空壳，我们还需要安装 clang-format 工具，工具在哪里下？其实它也是 LLVM 中的一个工具，可以在这里下载：[LLVM Download Page](https://releases.llvm.org/download.html)：

<img src="./LV515-C与C++开发/img/image-20250521222441032.png" alt="image-20250521222441032"  />

点开就会发现有一堆的包，像下面这种上百 M 的，是免安装版本，下载完解压就能用：

<img src="./LV515-C与C++开发/img/image-20250521222551167.png" alt="image-20250521222551167" />

还有一种我看是 windows 下的可执行文件：

<img src="./LV515-C与C++开发/img/image-20250521222726246.png" alt="image-20250521222726246" />

这种的就是安装包，安装完后会包含 clangd 和 clang-format。解压那种有些也是都有：

<img src="./LV515-C与C++开发/img/image-20250521224150979.png" alt="image-20250521224150979" />

所以其实前面也没太大必要专门装一个 clangd。这个工具主要是在 Remote SSH 中使用，后续要安装到 linux 中。当然在我的 ubuntu 中可能这个版本是用不了的，就像这样：

<img src="./LV515-C与C++开发/img/image-20250521224235154.png" alt="image-20250521224235154" />

为这个去折腾感觉有点不值，我选择 apt 安装，哈哈哈！！！

#### 3.2 命令安装

另外也可以通过命令安装：

```shell
sudo apt install clang-format
```

通过命令安装出来的版本多比较老，但是其实吧，完全够用啊，就格式化代码，还有啥花里胡哨的 😁，可以后面有需要再升级。

<img src="./LV515-C与C++开发/img/image-20250519075313217.png" alt="image-20250519075313217" />

#### 3.3 风险提示

可以去 github 下一个新版本的解压安装：[Releases · llvm/llvm-project](https://github.com/llvm/llvm-project)，比如 [llvm/llvm-project at llvmorg-20.1.5](https://github.com/llvm/llvm-project/tree/llvmorg-20.1.5)。但是呢，新版本可能会有风险，例如：

<img src="./LV515-C与C++开发/img/image-20250519230908897.png" alt="image-20250519230908897" />

所以我后面其实用的是 ubuntu 自带的那个版本。我是 ubuntu20.04，我看用这个版本也可以：[Release LLVM 15.0.0 · llvm/llvm-project](https://github.com/llvm/llvm-project/releases/tag/llvmorg-15.0.0)

<img src="./LV515-C与C++开发/img/image-20250519231847994.png" alt="image-20250519231847994" />

> Tips：新的版本可能会支持更多更详细的配置项吧，反正尽可能选可用的新版本就行。

### 4. clang-format 配置

#### 4.1 <a id="section1"> 扩展配置 </a>

我们可以在 settings 配置：

```json
{
    // xaver.clang-format
	//"clang-format.executable": "/home/sumu/2software/LLVM-20.1.5-Linux-X64/bin/clang-format", // 配置clang-format可执行程序路径
	"clang-format.executable": "clang-format",
	"clang-format.assumeFilename": "/home/sumu/2software/LLVM-20.1.5-Linux-X64/config/.clang-format", // 配置clang-format配置文件路径
	"clang-format.style": "file", // clang-format风格。（style=value， value可以是file， LLVM，谷歌，Chromium, Mozilla， WebKit或json configure）
	"[c]": {
		"editor.defaultFormatter": "xaver.clang-format" // C文件默认格式化程序
	},
	"[cpp]": {
		"editor.defaultFormatter": "xaver.clang-format" // C++默认格式化程序
	},
}
```

主要是配置一些源文件的默认格式化程序以及 clang-format 可执行程序的路径。

#### 4.2 使用指定的格式化文件

##### 4.2.1 `.clang-format` 文件

当内置的格式化风格不能满足需求时，可以使用 .clang-format 文件自定义格式。生成 .clang-format 文件的命令如下：

```shell
clang-format -style=google -dump-config > .clang-format
```

生成的 .clang-format 文件可以根据需要进行修改，然后把它放在代码文件的同一目录下，使用时指定 clang-format.style = file

```json
{
    // 指定风格化文件路径
    "clang-format.assumeFilename": "/home/sumu/xxx/.clang-format", 
    // clang-format风格，当不使用内置时，这里配置成file
	"clang-format.style": "file",   
}
```

其实也可以不指定 clang-format.assumeFilename，这样我们将.clang-format 文件放置在工程目录根目录下也是可以的。假设项目目录结构如下：

```shell
project-root/
├── main.cpp
├── utils.cpp
├── utils.h
└── .clang-format
```

在 .clang-format 文件中可以添加以下内容：

```yaml
BasedOnStyle: LLVM
IndentWidth: 4
ColumnLimit: 80
SortIncludes: true
```

然后右键格式化文档即可。

##### 4.2.2 常用配置

```yaml
# .clang-format
BasedOnStyle: Microsoft # Google|Chromium|Mozilla|WebKit|Microsoft|GNU

# 头文件排序
SortIncludes: true
IncludeCategories:
  - Regex: '^<.*>'
    Priority: 1
  - Regex: '^".*"'
    Priority: 2

# 从switch语句开始，缩进大小写标记一个级别。
IndentCaseLabels: true

# 使预处理指令（如 #if）与其内部的代码块保持相同的缩进层级。
IndentPPDirectives: None

# 强制类名与{保持在同一行
BreakBeforeBraces: Custom
BraceWrapping:
  AfterClass: false      # 
  AfterNamespace: false  # 命名空间后换行
  AfterStruct: false

# 对齐c++类中的成员变量
AlignConsecutiveDeclarations: true

# 命名空间缩进配置
NamespaceIndentation: All 

# 缩进宽度（如 2、4）
IndentWidth: 4
```

## 三、C/C++

### 1. 简介

Visual Studio Code 的 C/C++ 支持由 [Microsoft C/C++ 扩展](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) 提供，以便在 Windows、Linux 和 macOS 上实现跨平台 C 和 C++ 开发。当您创建一个 `*.cpp` 文件时，该扩展会添加诸如语法高亮（着色）、智能补全和悬停（IntelliSense）以及错误检查等功能。

> Tips：
>
> （1）C/C++扩展和clangd扩展在vscode中有冲突，这里需要注意同时最好就还是只用一个。
>
> （2）vscode 官方推荐的 C/C++ 插件是 cpptools，好像这个插件十分吃资源，并且容易崩溃，所以有一段时间很多人都推荐用clangd，但是听说后来两者大差不差了。需要知道的是clangd 需要有一个 `compile_commands.json` 文件才能工作，这一点是比不上之前的 cpptools 安装即用方便的，我自己感觉有`compile_commands.json` 文件存在的话，跳转会准确一点，但是cpptools现在也支持使用`compile_commands.json`文件了，反正总之就看自己用哪个习惯了。

### 2. 扩展安装

这个就没啥说的了，直接扩展中心搜一下。

### 3. 扩展配置

这里其实我自己没有怎么太折腾，具体可以看vscode官方文档：[配置 C/C++ IntelliSense - VSCode · AI 代码编辑器](https://vscode.js.cn/docs/cpp/configure-intellisense)

>参考资料：
>
>[Clang-Format Style Options — Clang 21.0.0git documentation](https://clang.llvm.org/docs/ClangFormatStyleOptions.html)
>
>[Clang-Format 样式选项 — Clang 20.0.0git 文档 - Clang 编译器](https://clang.llvm.net.cn/docs/ClangFormatStyleOptions.html)
>
>[Clang-format 格式化及配置参数-CSDN 博客](https://blog.csdn.net/Once_day/article/details/127761573)
>
>[LLVM 的 Clang C 语言家族前端 - Clang 编译器](https://clang.llvm.net.cn/)
>
>[Clang C Language Family Frontend for LLVM](https://clang.llvm.org/)

