【C言語/VSCode】インテリセンスの有効範囲を広げる(includePathの設定)

インテリセンス有効範囲を広げる方法の解説ページアイキャッチ

このページでは、VSCode で「インテリセンスの有効範囲」を広げる方法について解説していきます。

要は、インテリセンスが効かない関数等でも「インテリセンスが効くようにする方法」を解説します。

C言語で動作確認していますが、おそらく C++ においても同様の手順でインテリセンスの有効範囲を広げることができると思います。

インテリセンスとは

まず簡単にインテリセンスについて説明しておきます。

インテリセンスの知識がある方や、すぐにインテリセンスの有効範囲を広げる方法を知りたい方はインテリセンスの有効範囲を広げる方法までスキップしていただければと思います。

インテリセンス(IntelliSense)というのは下記のような機能です。

  • 関数名の補完
  • 構造体変数のメンバ名の補完
  • 関数の宣言の表示

などなど。

インテリセンスが動作している様子

このインテリセンス機能を提供しているのは、VSCode 本体ではなくプラグイン(拡張機能)になります。

VSCode を利用しているC言語プログラマーの中で最も多く利用されているプラグインは「C/C++」だと思います。C言語や C++ においては、このプラグインがインテリセンス機能を提供してくれています。

C/C++拡張機能

関数名や引数に迷ったときのヒントにもなりますし、誤字脱字も防ぐことができ、おそらく VSCode を利用されているほとんどの方が恩恵を感じていると思います。

もちろん私もその恩恵を受けている一人です!

僕もだね!

便利すぎて、これなしでプログラミングするのはもう考えられないなぁ

そうだね!

でも、インテリセンスがどんな関数にも効果があるとは限らないんだ…

このインテリセンスが便利すぎるので、逆にインテリセンスが効かないと不便に感じる人も多いと思います。

ですが、インテリセンスが効かない場合もあります。これは特に「標準ヘッダーで定義されていない関数」です。

例えば自身でインストールした外部ライブラリの関数などは、インテリセンスが効かない可能性が高いです。

インテリセンスが効かない理由

では、なぜインテリセンスが効かないかというと理由は単純で、VSCode がその関数を知らないからです。

そりゃそうだよね…

いくら VScode といえども知らない関数の情報は教えてくれないよね

そうだね!

でも逆に知ってる関数はしっかりインテリセンスが効くよ

なので、その関数の情報を教えてやればいいわけだ!

あくまでもインテリセンスが効かないのは VSCode がその関数を知らないからであって、知っている関数に関しては全てインテリセンスを効かせることができます。

ですので、この VSCode が知らない関数の情報を VSCode に教えてやることで、インテリセンスが有効になる範囲を広げることが可能です。

ここからは VSCode のプラグイン「C/C++」において、インテリセンスが有効になる範囲を追加する具体的方法を解説していきます。

スポンサーリンク

インテリセンスの有効範囲を広げる方法

先ほど「VSCode が知らない関数の情報を VSCode に教えてやる」と説明しました。

具体的に何を VSCode に教えてやれば良いかというと、インテリセンスが効くようにしたい関数の宣言が行われている「ヘッダーファイルのフォルダのパス」です。

このフォルダのパスを VSCode に教えてやることで、そのフォルダ以下のヘッダーファイルを VSCode が解釈し、その解釈した内容に合わせてインテリセンスが機能するようになります(ヘッダーファイルで宣言されている関数の関数名補完や引数の情報表示をしてくれる)。

では、どうやって VSCode にそのフォルダのパスを教えてやれば良いかというと、結論を言うと c_cpp_properties.json という .json ファイルの includePath にそのフォルダのパスを追記してやれば良いです。

これにより、VSCode が includePath 以下のヘッダーファイルを解釈し、それらのヘッダーファイルで宣言されている関数に対してインテリセンス機能が効くようになります。 

そもそも c_cpp_properties.json なんてファイルないよ…

おそらく大半の人がそのファイルが無い状態だと思うよ

なので作り方から説明していくね!

c_cpp_properties.json は、ワークスペース以下の .vscode フォルダの中にあります。もしそこに無いようであれば、まずはこの c_cpp_properties.json を追加する必要があります。

ということで、ここからは下記の2つの手順について解説していきます。

  • c_cpp_properties.json を追加する
  • c_cpp_properties.jsonincludePath の設定を追記する

c_cpp_properties.json を追加する

では c_cpp_properties.json を追加していきましょう!

まず、てきとうなファイルを作成し、ソースコード編集画面を表示します(わざわざファイルを作成しなくても、ソースコード編集画面さえ表示できれば良いです)。

さらに、そのソースコードで、インテリセンスを有効にしたい関数が宣言されているヘッダーファイルを include します。

例えば、私は openssl/ssl.h に宣言されている関数群に対してインテリセンスが効くようにしたかったので、openssl/ssl.hinclude しました。

ヘッダーをインクルードする様子

インテリセンスが効いていないということは、VSCode がその関数が宣言されているヘッダーファイルを認識できていないということなので、上の図のように include 文のところに波線で警告表示されているはずです。

この波線のところにマウスカーソルを合わせると下記のようなエラーが表示されると思います。

#include エラーが検出されました。includePath を更新してください。この翻訳単位 (/Users/daeu/Documents/programming/includePath/main.c) では、波線が無効になっています。C/C++(1696)

で、その波線(include 文)にマウスカーソルを合わせた状態で「左クリック」すると、下の図のような電球マークが表示されると思います。

電球マークが表示される様子

続いてこの電球マークを「左クリック」します。すると、下のようなメニューが表示されると思います(初めてこの手順を踏む場合は1行目は表示されない可能性が高いです)。

電球をクリックしたときに表示されるメニュー

ここで「”includePath” 設定の編集」を選択すれば、下のような「intelliSense の構成」画面が表示されます。

intellisenseの構成画面

そして、この画面が表示されるとともに c_cpp_properties.json が作成されます。作成されたことを、ワークスペース下の .vscode フォルダ以下を見て確認してみてください。

c_cpp_properties.jsonが追加された様子

ファイルの作成が確認できれば、 「c_cpp_properties.json を追加する」手順は完了です!

c_cpp_properties.jsonincludePath の設定を追記する

続いて c_cpp_properties.jsonincludePath に、インテリセンスが効くようにしたい関数の宣言が行われている「ヘッダーファイルのフォルダのパス」を追記します。

この方法は2つあります。どちらで行なっても OK です。

  • 「intelliSense の構成」画面から編集する
  • c_cpp_properties.json を直接編集する

「intelliSense の構成」画面から編集する

c_cpp_properties.json を追加する際に表示された「inteliiSense の構成」画面から includePath への追記を行うことが可能です。

intellisenseの構成画面

この「intelliSense の構成」画面の下の方に行くと、下のような「パスを含める」の項目があります。

インテリセンスの有効範囲を広げるために編集するのはここです。

「パスを含める」編集画面

上の図のテキストボックスに、インテリセンスが効くようにしたい関数の宣言が行われている「ヘッダーファイルのフォルダのパス」を追記します。

おそらく ${workspaceFolder}/** がデフォルトで入力されていると思いますので、これの下の行にフォルダのパスを追記します。

例えば、私は openssl/ssl.h で宣言されている関数をインテリセンスが効くようにしたかったので、openssl/ssl.h が設置されているフォルダのパス /usr/local/opt/openssl@1.1/include を追記しました。

パス追記後の画面

これにより、c_cpp_properties.jsonincludePath 設定に追記したフォルダパスが追加され、そのフォルダパス以下にあるヘッダーファイルで宣言されている関数等にインテリセンスが効くようになります。

MEMO

自作した関数などに対してもインテリセンスが効くのは、includePath${workspaceFolder}/** がデフォルトで設定されているからだと思います

c_cpp_properties.json を直接編集する

もう一つの方法は c_cpp_properties.json を直接編集する方法になります。

追加された c_cpp_properties.json を開いてみてください。私の c_cpp_properties.json の中身は下記のようになっていました。

c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "macFrameworkPath": [],
            "compilerPath": "/usr/local/bin/gcc-10",
            "cStandard": "gnu17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "macos-gcc-x64"
        }
    ],
    "version": 4
}

OS などの環境によって中身は異なると思いますので、上記と一緒でなくても問題ないので安心してください。

今回編集するのは下記の includePath 設定の部分です。

includePath
            "includePath": [
                "${workspaceFolder}/**"
            ],

この includePath 設定の [ ] 内に、インテリセンスが効くようにしたい関数の宣言が行われている「ヘッダーファイルのフォルダのパス」を追記します。

"${workspaceFolder}/**" はデフォルトで入力されていると思いますので、この行の最後に ,(コンマ)を追記し、改行して次の行にフォルダパスを追記します。

例えば /usr/local/opt/openssl@1.1/include を追加する場合は下記のように編集します。

編集後のincludePath
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/local/opt/openssl@1.1/include"
            ],

includePath が追加されたことで、VScode が追加されたフォルダ以下のヘッダーファイルも解釈し、そのヘッダーファイルで宣言されている関数に対してもインテリセンスが効くようになります。

includePath 追加の効果確認

includePath を追加してインテリセンスが効くようになったかを確認してみましょう!

まず includePath を追加することで、c_cpp_properties.json を追加する時に include 文が波線で警告表示されていたのが解消されていることが確認できると思います。

includePath追加後のinclude文

さらに、include 文のヘッダーファイル名のところを右クリックしてメニューを表示し、その後「定義へ移動」をクリックすると、そのヘッダーファイルを表示することができるようになっていると思います。

定義へ移動メニュー

おそらくこれが確認できればインテリセンスが効くようになっているはずです。

続いてソースコード編集画面で、もともとインテリセンスを効くようにしたかった関数名を記述してみましょう。

関数名候補が表示される様子

記述途中で関数名の候補が表示され、タブキーを押すことで関数名が補間されるようになっているはずです。

また、記述した関数名にマウスカーソルを合わせれば、その関数の宣言がポップアップで表示されるようになっているはずです。

関数宣言がポップアップで表示される様子

この辺りまで確認できれば、ばっちりインテリセンスが効いていると言えると思います。

もし上手くインテリセンスが効いていないようであれば、includePath に記述したフォルダパスが合っているかどうかを再度ご確認いただければと思います。

スポンサーリンク

コンパイル時の設定への追加も忘れずに

c_cpp_properties.json の includePath</codeの変更はあくまでもインテリセンスの対象にヘッダーを追加するための設定である点に注意してください。

コンパイラのインクルードパスに c_cpp_properties.json で追記したフォルダパスが設定されるわけではないです。

ですので、VSCode からコンパイルを行うような場合は別途 tasks.json-I オプションでフォルダのパスを指定する必要があります。

例えば下記ではコンパイル時のオプションに -I/usr/local/opt/openssl@1.1/include を追加し、コンパイル時にも /usr/local/opt/openssl@1.1/include 以下のヘッダーを参照するようにした tasks.json になります(★部分)。

tasks.json
{
    // tasks.json 形式の詳細についての資料は、
    // https://go.microsoft.com/fwlink/?LinkId=733558 をご覧ください
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "ssl_build",
            "command": "gcc",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-Wall",
                "-lssl",
                "-I/usr/local/opt/openssl@1.1/include",// ★ヘッダーのあるフォルダを追加
                "-L/usr/local/opt/openssl@1.1/lib"
            ],
            "group": "build"
        }
    ]
}

まとめ

このページでは、VSCode の「C/C++」拡張機能における「インテリセンスの有効範囲を広げる」方法を解説しました。

いつもインテリセンスの恩恵を受けていると、逆にインテリセンスが効かないとすごく不便です…。

ただし、今回紹介した方法でおそらく全ての関数や定義に対してインテリセンスを効かせることができるようになります!

設定自体も簡単ですので、楽にプログラミングするためにも、是非このページで解説した内容を参考にしてください!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です