61
54

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VSCode で clangd を使って、賢いC++インテリセンス環境を整える

Last updated at Posted at 2024-02-22

VSCode の標準のC++インテリセンスでは、簡単なコード補完などや、構文が間違ってるなどのエラー表示はリアルタイムに出来ますが、警告などはリアルタイム表示出来なかったり、その他コーディング時に行ってほしい賢い機能が不足しがちです。

例えば以下のコードは、セミコロン忘れなどのエラーは表示してくれますが、未初期化変数の f などはコンパイル時に警告がちょろっと出るだけで、見落としてしまいます。

#include <iostream>
using namespace std;

int main(){
    int f;
    cout << f << endl;

    cout << "semicolon" << endl
    return 0
}

image.png

MS 標準の C++ インテリセンスはそこまで賢くないからというのが理由なのですが、ここで変わりに clangd を使うことで、賢いリアルタイムインテリセンスを使えるようにします!

しかも、拡張を入れて、各プロジェクトで使い回せる設定ファイルを置くだけのシンプル環境構築法です。

また、CLion や Rust などでもおなじみの、コード内に追加情報をインラインで表示する inlay hints も使えるようになります。

自分の環境では以下のようになります。

image.png

未初期化の answer に警告が表示されている他、関数呼び出しの引数にパラメーター名が表示されています。関数を呼ぶときに引数をどの順番で書くのか分かりやすくなります(オプションで消すことも出来ます)。

clangd という名前ですが、clang コンパイラの他に gcc なども使用可能です!

clangd 拡張のインストール

拡張機能タブから「clangd」を検索してインストールします。
image.png

インストールが完了すると、標準のインテリセンスと競合が発生するので標準インテリセンスを無効にするように指示されます。無効にします。
image.png

パスに clangd が見つからなかったり古いと、VSCodeの内部ディレクトリにインストールするダイアログが出ます。このダイアログでインストールしてもシステムの方の clangd は干渉しないのでインストールしましょう。
image.png
インストールしたら、VSCodeを再起動します。

VSCode でプログラムを書くフォルダを開いたら、compile_flags.txt を作成します。ここには指定するコンパイルオプションを1行ずつ書きます。VSCode の Settings などで設定した include パスなどは clangd は読まないので、ここに全て書きます。

例えば以下のような感じです。

compile_flags.txt
-Wall
-Wextra
-Wno-unknown-pragmas
-Wno-unused
-Wno-unused-parameter
-Wno-sign-compare
-std=gnu++17
-I
atcoder-library/

image.png

compile_flags.txt を変更してもリアルタイムには反映されないので、設定を変えたら VSCode を再起動します。

すると、以下のようにオプションに合わせて警告を表示してくれます。
image.png

以下のような、if の中で == を間違えて = と打ってしまっても、ちゃんとリアルタイムに波線を引いてくれます。
image.png
(余談ですが、本当に if 文の中で代入を行いたいときは、if ((a = 0)) と、() で式全体をくくると警告が出なくなります。)

Inlay Hints

他にも clangd は、コード内に追加情報をインラインで表示する機能があります。例えば以下のように動作します。

image.png

関数のパラメーター名を呼び出し側で表示してくれたり、auto と書いた型を教えてくれたりします。パラメーターヒントの方は、変数名とパラメーター名が一緒のときは省略してくれます。

また、配列の初期化のときに、各要素の配列インデックスを教えてくれます。

image.png

これらが不要なときは、compile_flags.txt と同様に .clangd ファイルを作って、そこで以下のように設定します。

.clangd
InlayHints:
  Enabled: Yes
  ParameterNames: Yes
  DeducedTypes: No
  Designators: No
  • ParameterNames: 関数呼び出しのパラメーター名の表示
  • DeducedTypes: auto の型の表示
  • Designators: 配列インデックスの表示
    になります。

また、VSCodeの設定を追加することで、主張の強すぎる InlayHint を弱めることが出来ます。
自分は、settings.json (ユーザー設定(JSON)) に以下の設定を追加して、Inlay Hintの表示を半透明にしています。

settings.json
    "workbench.colorCustomizations": {
        "editorInlayHint.background": "#11111111",
        "editorInlayHint.foreground": "#eeeeee19",
    }

そうすると、このくらいの主張度になります。
image.png
このくらいの薄さであれば普段は気にならず、引数について気になるときにはヒントに注目すれば情報を得られて、良いと思っています。

余談ですが、workbench.colorCustomizations は他にも様々な場所のスタイルを変更でき、 editorWhitespace.foreground で空白文字の表示方法、editorStickyScroll.background で StickyScroll の背景の色を変更できます。詳しくはこちら

FAQ

compile_flags.txt を毎プロジェクト用意するのだるい。どこかにまとめたり、settings.json に書けないの?

自分もやり方わかりません。多分無い気がします。
compile_flags.txt の他に、各ソースコード用にオプションを書く方式の compile_commands.jsonsettings.json でパスを指定できますが、これは各ファイル名に一致している必要があり、ワイルドカードなどが使えないので厳しそうです。

最後に

いかがだったでしょうか?
もし良いと思ったら記事の「いいね」と「ストック」お願いします。

61
54
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
54

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?