🏢

VSCodeでモダンなC++開発環境構築(CMakeとclang-format編)

2022/09/29に公開

概要

↓ 前回の続きです。
https://zenn.dev/kiraemon/articles/df3c9aedfc3c13

目標

前回は C++用コンテナを構築し、VSCode と連携するところまで行いました。
今回は clang-format によるフォーマット設定と cmake によるプロジェクト作成を行います。

環境構築

フォーマット設定

フォーマットの設定には clang-format を使います。

プロジェクト直下に .clang-format という名前の設定ファイルを作成し、yml 形式でフォーマット設定を記述します。

ここでは BasedOnStyle に Google を指定しています。
こうすることで、Google が定めた C++フォーマットに整形されるようになります。
また、コメントアウトしておりますがインデント幅や自動改行設定を行うこともできます。

.clang-format
# デフォルト設定
BasedOnStyle: Google

# インデント幅
# IndentWidth: 4

# 自動改行させない
# ColumnsLimit: 0

前回導入した拡張機能である"C/C++"に どのフォーマッタを使用するか設定します。
その際保存やペーストしたときの設定を追加すれば、フックしてフォーマットするようになります。
また、C++バージョン(ここでは C++17)の設定も一緒にしてあげればそのバージョン前提のインテリセンスが動作します。

Preferences からも設定できますが、プロジェクトにファイルを作成していればプロジェクト単位で設定が反映されるようになります。

プロジェクト直下に ".vscode/settings.json" を作成します。

settings.json
{
    "C_Cpp.clang_format_path": "/usr/bin/clang-format",
    "C_Cpp.default.cppStandard": "c++17",
    "editor.defaultFormatter": "ms-vscode.cpptools",
    "editor.formatOnSave": true,
    "editor.formatOnPaste": true
}

DockerFile に記述した clang-format がどのパスかはwhichコマンドで確認できます。

root@326af17361a7:/workspaces/cpp_test# clang-format --version
clang-format version 10.0.0-4ubuntu1
root@326af17361a7:/workspaces/cpp_test# which clang-format
/usr/bin/clang-format
root@326af17361a7:/workspaces/cpp_test#

それでは適当にフォーマットされていないコードを実装してテストしてみます。
上記の settings.json だとペーストや保存にフックしてフォーマットします。
また、shift + option + F で手動フォーマットも可能です。

フォーマット前
#include <iostream>

void ShowStrings(std::string_view str)
{
  std::cout << str << std::endl; return;
}

int main() {
    ShowStrings("Hello, world");
    }
フォーマット後
#include <iostream>

void ShowStrings(std::string_view str) {
  std::cout << str << std::endl;
  return;
}

int main() { ShowStrings("Hello, world"); }

フォーマットがかかることが確認できると思います。
(ついでに std::string_view がインテリセンスの予測にでれば、C++17 の設定も適用されていることが確認できます。std::string_view は C++17 で追加された文字列型です。)

プロジェクト作成

ここからは Cmake を使って簡単なプロジェクトを作成します。
フォーマット同様、CMake とそれを VSCode で扱うための拡張は前回インストール済みです。

ここまでに作成したa.outmain.ccは削除してしまって構いません。

Shift + Cmd + Pでコマンドパレットを開き、Cmake: Quick Start を選択します。

コンパイラの選択画面では GCC を選択します。

プロジェクト名を入力します。

今回は実行ファイルを作りたいので、Executable を選択します。

すると、buildディレクトリ、CMakeLists.txtmain.cppが作成されます。

これでビルド&実行の準備が整ったので実行してみます。ちょっと分かりづらいですが、最下部の ▶️ ボタンを押すとビルドから実行まで行ってくれます。
Hello, world!がコンソールに出力されることを確認します。

▶️ ボタンを押すと良くわからないですが、CMake は Makefile(と、諸々たくさん)生成ツールなのでもちろんターミナルから実行することもできます。
先ほどの ▶️ ボタンは以下のようなことを行っています。

root@326af17361a7:/workspaces/cpp_test# cd build/
root@326af17361a7:/workspaces/cpp_test/build# cmake ../  // Makefile生成
-- Configuring done
-- Generating done
-- Build files have been written to: /workspaces/cpp_test/build
root@326af17361a7:/workspaces/cpp_test/build# make  // Makefileを元にビルド
Scanning dependencies of target test-project
[ 50%] Building CXX object CMakeFiles/test-project.dir/main.cpp.o
[100%] Linking CXX executable test-project
[100%] Built target test-project
root@326af17361a7:/workspaces/cpp_test/build# ./test-project  // 実行
Hello, world!
root@326af17361a7:/workspaces/cpp_test/build#

まとめ

今回はフォーマット設定とプロジェクト作成を行いました。
1人や少人数であれば独自設定で良いですし、ミニマムで検証するときは 前回のような g++ 直コンパイルで十分事足りると思いますが、
中〜大規模プロジェクトではこういった設定をしっかり管理/構築していくことが大事だと考えています。

次回はもう少し複雑な構成のプロジェクトを作成して、google test, google mock, google benchmark を使ったテスト、gdb を使ったデバッグを行います。

おまけ

ここまでの内容は以下リポジトリにプッシュしておりますのでご自由に参照いただければと思います。
(色々拡充していく予定ですので、現記事段階の内容と乖離があれば 2nd コミットを参照いただければ本内容と同一のものになっていると思います 🙇‍♂️)

https://github.com/kiraemon/cpp-base

Discussion