---
# System prepended metadata

title: 【軟體開發】Clang Format 筆記
tags: [Software Development]

---

# 【軟體開發】Clang Format 筆記

## 前言
在多人協作與大型專案開發中，**統一程式碼風格**是維護程式品質的基本功。Clang-format 就是專為這個目的設計的工具，能夠自動調整縮排、空格、換行與括號風格等，使程式碼保持一致、易讀且可維護，讓自己不需要再手動調整程式碼，藉由工具來協助你讓程式碼風格一致!

本文將從新手角度出發，介紹 Clang-format 的基本概念、安裝使用方式、設定 `.clang-format` 檔案，以及格式化指令


## 什麼是 Clang-format？

Clang-format 是 LLVM 專案開發的自動程式碼格式化工具，支援語言包括 : 

- C / C++
- Java / JavaScript
- Objective-C
- Protobuf 等

它會依照指定風格 ( 如 Google、LLVM、Mozilla 等 ) 自動調整程式碼格式，不修改邏輯，只改排版。常見應用情境包含 : 

- 團隊統一風格
- 開發時自動格式化 ( Save on format )
- 加入 CI/CD 做格式檢查

## 安裝方式
- macOS ( Homebrew ) :
```bash
brew install clang-format
```
- Ubuntu / Debian : 
```bash
sudo apt install clang-format
```
- Windows : 
```bash
可透過 Visual Studio 安裝 LLVM 工具集，或使用 LLVM 官網 提供的安裝檔。
```

## 建立 `.clang-format` 設定檔

快速產生一份範本設定檔的方法如下 : 
```bash
clang-format -style=llvm -dump-config > .clang-format
```

上述指令會根據 LLVM 的風格產生 .clang-format，你可自行修改其中參數來符合團隊需求。

### 常用設定說明
```yaml
BasedOnStyle: LLVM      # 基礎風格，可改為 Google、WebKit、Microsoft…
IndentWidth: 4          # 每層縮排寬度（建議 4，較不擁擠）
UseTab: Never           # 不使用 tab，統一用空格縮排
ColumnLimit: 100        # 每行最多字元，0 表示不限制
BreakBeforeBraces: Allman  # 大括號換行風格，可選 Attach、Stroustrup 等
```

## 實際格式化範例
```cpp!
int main(){int x=1; if(x>0){x++;}return 0;}
```

修改後程式碼如下圖所示

```cpp!
int main() {
    int x = 1;
    if (x > 0) {
        x++;
    }
    return 0;
}
```

## Command 指令
* `find ./ -name '*.[ch]' -o -name '*.[ch]pp' | xargs clang-format -i`
    * 搜索當前目錄及其子目錄中的所有 `.c`、`.h`、`.cpp` 和 `.hpp` 文件，並使用 `clang-format` 進行 **in-place** 方式修改文件。
    * `find ./` : 在當前目錄（`.`）及其所有子目錄中進行查找。
    * `xarg`: 將標準輸入轉換為命令行參數
    * `|`: 管道操作符，將前一個命令的輸出傳遞給後一個命令。


## Clang-format vs Clang-tidy 差異？
- `clang-format` : 著重於**格式風格**的統一 ( 空格、括號、縮排等 ) 
- `clang-tidy` : 著重於**程式碼潛在問題檢查** ( 記憶體洩漏、未使用變數、效能問題等 )