Visual Studio CodeでC/C++の補完の設定をする

2020年6月7日

こんにちは。

先日、開発環境を整えるの内容で書いた内容や、今は削除してしまった過去のブログで書いたarm-none-eabiを直接インストールしてGNU Makeでコンパイルを行うプロジェクトを作成したときに、STM32CubeMXで作成してもらったファイルのAPIの定義等の補完がかからないので困るという話をちらっと聞いたので、補完を利かすための方法を書いていきたいと思います。

この記事では、STM32のプロジェクトを用いて設定をしていますが、他の環境でも同様の方法で設定することが可能です。

bash on windowsで環境構築をした話はこちらです。

Windows環境にmakeやgcc-arm-none-eabiを直接入れる方法も要望があれば書きます。Twitterなどでつぶやいていただければと思います。(私のPCにはなぜか両方の環境が入っています。)




補完がされるようにする

拡張パックをインストールする

Visual Studio Codeの拡張パックであるC/C++ for Visual Studio Codeをインストールしましょう。Extentionsからインストールが可能です。

インストールが完了したら、STM32CubeMXで作成したMakefileがあるディレクトリをVisual Studio Codeで開いてください。

c_cpp_properties.jsonの編集をする

「ctr」+ 「Sihft」 + 「P」を押すと以下の画像のようなバーが出ます。

構成の編集を選んでエンターを押すと、c_cpp_properties.jsonが.vscodeディレクトリが作成されその中に作られます。

私の場合の編集を行った後のファイルを以下に示します。使用しているマイコンはSTM32F411CEU6,APIはLLライブラリです。

{
    "configurations": [
        {
            "name": "STM32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/Program Files (x86)/GNU Tools ARM Embedded/7 2017-q4-major/arm-none-eabi/include/**",
                "C:/Program Files (x86)/GNU Tools ARM Embedded/7 2017-q4-major/lib/gcc/arm-none-eabi/7.2.1/include/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE",
                "USE_FULL_LL_DRIVER",
                "STM32F411xE"
            ],
            "windowsSdkVersion": "10.0.17763.0",
            "compilerPath": "arm-none-eabi-gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}

Includeパスにgcc-arm-none-eabi内に存在するincludesディレクトリを追加、"defines"にMakefileのDEFINEに定義されているUSE_FULL_LL_DRIVERとSTM32F(マイコン依存)を設定しました。

これを設定することによって補完がされるようになります。

簡単に理由を調べてみたところ、API側で作成されたファイルの中に#if () 1 ~ #endifのマクロが組まれており、上記の二つのdefineが定義されているときにコメントアウトされているものを外したり、コメントアウトを行ったりの判断を行っているためです。そのため、Makefileで定義をされていて、コンパイルをするときにはコメントアウトされていなくとも、visual studio codeのインテリジェンス側ではdefineされていないためコメントアウトされたプログラムであると理解されているためです。

HALAPIを使用している場合は、makefileのDEFINEに定義されているUSE_HAL_DRIVERをUSE_FULL_LL_DRIVERのかわりに定義してあげればOKだと思います。

今回、definesに設定をc_cpp_properties.jsonにしたことで、インテリジェンス側にもdefineがあると判断されるため無事補完がかかるようになるようです。

また、includePathの追加は各自の判断に任せます。あった方が便利(?)だと思われます。

さいごに

参考にしたページは、visual studio codeのc/c++の拡張パックの公式ドキュメントです。

開発環境がかっこいい、使いやすいとモチベーションも上がるので面倒ですが設定はしっかりとやっていきたいところです。開発環境は適宜よくしていきたいところです。