C++ Lint 何が良いか問題

CI で PR に対して lint を使用する場合にどのようにするのが良いのか。考えた。

# cpplint
https://github.com/cpplint/cpplint
[error の詳細](https://github.com/google/styleguide/blob/gh-pages/cpplint/cpplint.py)
[ブログズミ: cpplint でコーディングチェック](https://srz-zumix.blogspot.com/2015/11/cpplint.html)

[Google Style Guides](https://google.github.io/styleguide/cppguide.html) に沿っているかどうかのみをチェックしてくれる。
カスタマイズ内容は各チェック項目の有効/無効のみ。
シンプルでわかりやすく、導入コストも低い (python だけ必要)。これで十分ならこれが一番いい。
Google Style Guideline が気に入らない場合や、もっと細かいカスタマイズがしたい場合は別案を検討する。

# clang format
[Clang 12 documentation - CLANGFORMAT](https://clang.llvm.org/docs/ClangFormat.html)
clang format は formatter だが、`--dry-run` オプションを指定すれば format せず指摘だけさせることもできる。
カスタマイズ内容が多岐に渡るのが良い。導入コストは高い。

### 導入方法
Windows の場合は下記サイトの Pre-Built Binaries の LLVM を DL してインストールすれば一緒に入る。
[LLVM Download Page](https://releases.llvm.org/download.html)

インストール時にパスも通せば、コマンドラインから `$ clang-format` だけで実行可能。

### オプション
`$ clang-format -help` を Google 翻訳した。

引数が指定されていない場合、標準入力からコードをフォーマットし、結果を標準出力に書き込みます。
<file> が指定されている場合は、ファイルを再フォーマットします。 -i が <file> と一緒に指定されている場合、ファイルはその場で編集されます。それ以外の場合、結果は標準出力に書き込まれます。

`usage : clang-format [options] [<file> ...]`

OPTIONS:

| Clang-format options | 内容 |
|----|--------|
| --Werror | 設定されている場合、フォーマットの警告をエラーに変更します |
| --assume-filename=<string> | 言語を決定するために使用されるファイル名を上書きします。stdinから読み取る場合、clang-format はこのファイル名を想定して言語を決定します。|
| --cursor=<uint> | エディター統合から clang 形式を呼び出すときのカーソルの位置 | 
| --dry-run | 設定されている場合、実際にフォーマットを変更しません |
| --dump-config | 構成オプションを標準出力にダンプして終了します。 -style オプションと一緒に使用できます。|
| --fallback-style=<string> | clang-format が -style=file で呼び出されたが、使用する .clang-format ファイルが見つからない場合のフォールバックとして使用される定義済みスタイルの名前。フォーマットをスキップするには、-fallback-style=none を使用します。|
| --ferror-limit=<uint> | 停止する前に発生する clang 形式のエラーの最大数を設定します (0=制限なし)。 --dry-runまたは-nでのみ使用されます |
| -i | 指定されている場合、編集 <file> を配置します。 |
| --length=<uint> | この長さの範囲をフォーマットします (バイト単位)。複数の -offset と -length のペアを指定することにより、複数の範囲をフォーマットできます。 -length なしで -offset を1つだけ指定すると、clang-format はファイルの最後までフォーマットします。 1つの入力ファイルでのみ使用できます。|
| --lines=<string>-<start line>:<end line> | 行の範囲をフォーマットします (両方とも1ベース)。複数の -lines 引数を指定することにより、複数の範囲をフォーマットできます。 -offset および -length と一緒に使用することはできません。 1つの入力ファイルでのみ使用できます。 |
|  -n | --dry-runのエイリアス |
| --offset=<uint> | このバイトオフセットで始まる範囲をフォーマットします。複数の -offset と -length のペアを指定することにより、複数の範囲をフォーマットできます。 1つの入力ファイルでのみ使用できます。 |
| --output-replacements-xml | 置換を XML として出力します。 |
| --sort-includes | 設定されている場合、SortIncludes スタイルフラグによって決定されるインクルードのソート動作をオーバーライドします |
| --style=<string> | 現在サポートされているコーディングスタイル : LLVM、Google、Chromium、Mozilla、WebKit。 `-style=file` を使用して、ソースファイル (または stdin の現在のディレクトリ) の親ディレクトリの1つにある .clang-format ファイルからスタイル構成をロードします。 `-style="{key: value,...}"` を使用して特定のパラメーターを設定します。例 : `-style="{BasedOnStyle: llvm, IndentWidth: 8}"` |
| --verbose | 設定されている場合、処理されたファイルのリストを表示します |

希望するコードのフォーマットスタイルが使用可能なオプションと異なる場合、`-style="{key: value,...}"` オプションを使用するか、スタイル構成ファイル .clang-format または _clang-format をプロジェクトのディレクトリに配置して `clang-format-style=file` を使用します。

.clang形式のファイルを作成する簡単な方法は次のとおりです。
`clang-format -style = llvm -dump-config> .clang-format`

### Style Options
[Clang 12 documentation - CLANG-FORMAT STYLE OPTIONS](https://clang.llvm.org/docs/ClangFormatStyleOptions.html)
[ClangFormatスタイルオプション](http://algo13.net/clang/clang-format-style-oputions.html)
[clang-formatのstyle比較](https://qiita.com/tttamaki/items/9486232a47abfead6d87)
[clang-format を イイ感じに設定する](https://yasuharu519.hatenablog.com/entry/2015/12/13/210825)