コードを綺麗に。clang-formatの導入

C/C++

わたすけです。clang-formatの解説をします。

スポンサーリンク

clang-formatとは

clang-formatとは、C/C++用のフォーマッタです。

ClangFormat — Clang 15.0.0git documentation

名前からわかるかもしれませんが、clangもといLLVM Projectの一貫です(この表現が正しいのかわからないですが、まあllvm/llvm-projectの中に入ってるのでいいでしょう)。

llvm-project/clang/tools/clang-format at main · llvm/llvm-project
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this ...

JavaScriptを書いている人は、Prettierというツールの名前を聞いたり、実際に使ったりしたことがあるのではないでしょうか?あれと同系統です。

これを使うと、ソースコードを決められたルールに沿って整形することが出来ます。

実際に使ってみる

こんなコードを書きます。ヤバいです。

ちなみに、当たり前ですがちゃんとビルドして実行できます。

では、clang-formatを使ってみましょう。Archだとclangをインストールしておけば使えます。

きれいになりましたね。batコマンドはcatの代替で、オプションでC言語であることを指定しています。

見てわかる通り、clang-formatはフォーマット結果を標準入力に出力します。必要であればリダイレクトなどをしましょう。

自動でフォーマットする

とは言ったものの、まあ面倒ですよね。大体のエディタでは、拡張機能などを用いて、保存した際に自動でフォーマットを行う設定をすることが出来ます。

VSCodeであれば、以下のような手順を踏みます。

C/C++拡張機能かclang-format拡張機能を導入

基本的に、C/C++拡張機能を入れておけば事足ります。補完機能とかもあるのでこっちを使ったほうが良いです。

ただ、フォーマッタだけじゃないと嫌!!という場合や、C/C++拡張が動かない!という場合は後者を入れましょう。

フォーマッタの設定をする

これは必要ない可能性もありますが、editor.defaultFormatter に関する設定が必要な可能性があります。

ファイル保存時に自動でフォーマットするオプションをオンにする

editor.formatOnSave をオンにしましょう。必要であれば editor.formatOnType とかもオンにしておけば良いと思います。

ここまで設定したら、さっきのファイルを開いて・・・

保存してみます。

ちゃんとフォーマットされます。

もちろん、リダイレクトがどうとか面倒な事を考えなくても大丈夫です。

VSCode以外でもおそらくclang-formatに関する設定はできると思います。例えばNeovimを使っている人であれば、 rhysd/vim-clang-format プラグインを導入してinit.vim等に「autocmd FileType c,cpp ClangFormatAutoEnable」と記述したらいけます。

設定

clang-formatでは、ディレクトリにある .clang-format ファイルから設定を読み込み、それに従ってフォーマットしてくれます。このファイルにYAML形式でルールを設定していくことになります。

例えば、void *hoge と書いた時に void* hoge とフォーマットしてほしければ、PointerAlignment というルールをLeftに設定します。

全てのオプションと設定項目はここに載っています。たぶん141種類1ページのソースを開いてdtタグの数を調べたものあります。

Clang-Format Style Options — Clang 15.0.0git documentation

まあ141種類ぜんぶ確認するのはなかなか大変だと思います。自分も30種類しか設定してません。

参考程度に、自分が使っている .clang-format ファイルを置いておきます。だいたいコメントが付いてると思いますが、ついてなければ上のドキュメントで検索してください。

coding-style/.clang-format at main · watasuke102/coding-style
My coding style. Contribute to watasuke102/coding-style development by creating an account on GitHub.

おわりに

フォーマッタは偉大です。最近Rustを書く機会が増えたのですが、Rustにはrust-fmtというフォーマッタがあり、重宝しています。もちろんJavaScriptを書く時はPrettierを使っています。

多分使い始めは大変だと思いますが、自分に合うルールを設定していけばどうにかなると思います。ルール通りのプログラムを書いてうれしくなりましょう。

コメント

タイトルとURLをコピーしました