VS Codeのエージェントモードを拡張するには、を試してください!

C++ 拡張機能の設定リファレンス

C++ 拡張機能の設定は高度な構成が可能です。この記事では、c_cpp_properties.json ファイルのスキーマについて説明します。VS Code の設定に関する一般的な情報については、設定の構成変数リファレンス、および VS Code の既定の設定 を参照してください。

C++ プロジェクトの構成を始めたいですか? まずは IntelliSense の構成から始めましょう。

変数の例

以下の JSON スニペットは、c_cpp_properties.json の構成例です。JSON ファイルには関連する変数のみを含める必要があり、不足しているフィールドは C++ 拡張機能によって既定値が入力されます。

{
  "env": {
    "myIncludePath": ["${workspaceFolder}/include", "${workspaceFolder}/src"],
    "myDefines": ["DEBUG", "MY_FEATURE=1"]
  },
  "configurations": [
    {
      "name": "Mac",
      "compilerPath": "/usr/bin/clang++",
      "intelliSenseMode": "macos-clang-x64",
      "includePath": ["${myIncludePath}", "${workspaceFolder}/**"],
      "defines": ["${myDefines}"],
      "cStandard": "c17",
      "cppStandard": "c++20",
      "macFrameworkPath": ["/System/Library/Frameworks", "/Library/Frameworks"],
      "browse": {
        "path": ["${myIncludePath}", "${workspaceFolder}"]
      }
    }
  ],
  "version": 4,
  "enableConfigurationSquiggles": true
}

トップレベルのプロパティ

  • env: 構成内で標準の環境変数構文 (${<var>} または ${env:<var>}) を介して置換に利用できる、ユーザー定義の変数の配列です。文字列と文字列の配列が受け入れられます。

  • configurations: プロジェクトと設定に関する情報を IntelliSense エンジンに提供する構成オブジェクトの配列です。既定では、拡張機能はオペレーティング システムに基づいて構成を作成します。さらに構成を追加することもできます。

  • version: このフィールドは編集しないことをお勧めします。これは c_cpp_properties.json ファイルの現在のバージョンを追跡し、拡張機能がどのプロパティと設定が存在すべきか、そしてこのファイルを最新バージョンにアップグレードする方法を認識できるようにします。

  • enableConfigurationSquiggles: true に設定すると、c_cpp_properties.json ファイルで検出されたエラーを C++ 拡張機能に報告します。

構成プロパティ

  • name: 構成を識別するための分かりやすい名前です。LinuxMac、および Win32 は、これらのプラットフォームで自動選択される構成の特別な識別子です。VS Code のステータス バーには、どの構成がアクティブであるかが表示されます。ステータス バーのラベルを選択して、アクティブな構成を変更することもできます。

  • compilerPath: プロジェクトのビルドに使用するコンパイラのフル パス (例: /usr/bin/gcc) で、より正確な IntelliSense を有効にします。拡張機能はコンパイラに問い合わせて、IntelliSense に使用するシステムのインクルード パスと既定の define を決定します。

    "compilerPath": "" (空の文字列) を設定すると、コンパイラへの問い合わせをスキップします。これは、使用したいコンパイラが問い合わせに使用される引数をサポートしていない場合に便利です。その場合、拡張機能は (MSVC のように) 見つけられるサポート対象のコンパイラを既定として使用します。compilerPath プロパティを省略した場合は、問い合わせはスキップされません。

  • compilerArgs: インクルード パスや define を変更するためのコンパイラ引数 (例: -nostdinc++, -m32 など)。スペースで区切られた追加の引数を取る引数は、配列内で別々の引数として入力する必要があります。例えば、--sysroot <arg> の場合は \"--sysroot\", \"<arg>\" を使用します。

  • intelliSenseMode: 使用する IntelliSense モードで、MSVC、gcc、または Clang のアーキテクチャ固有のバリアントにマッピングされます。設定されていない場合、または ${default} に設定されている場合、拡張機能はそのプラットフォームの既定を選択します。

    プラットフォームの既定値

    • Windows: windows-msvc-x64
    • Linux: linux-gcc-x64
    • macOS: macos-clang-x64

    <compiler>-<architecture> のバリアント (例: gcc-x64) のみを指定する IntelliSense モードは、レガシー モードであり、ホスト プラットフォームに基づいて自動的に <platform>-<compiler>-<architecture> のバリアントに変換されます。

  • includePath: インクルード パスとは、ソース ファイルによってインクルードされるヘッダー ファイルのディレクトリです。たとえば、ソース ファイルに #include "myHeaderFile.h" というインクルード ディレクティブが含まれている場合、このヘッダー ファイルのパスを includePath に追加します。インクルードされるヘッダー ファイルを検索する際に IntelliSense エンジンが使用するパスのリストを指定します。これらのパスの検索は再帰的ではありません。再帰的な検索を示すには、パスの末尾に /** を指定します。たとえば、${workspaceFolder}/** はすべてのサブディレクトリを検索しますが、${workspaceFolder} は検索しません。Visual Studio がインストールされている Windows を使用している場合、または compilerPath 設定でコンパイラが指定されている場合、システムのインクルード パスはここにリストすべきではありません。

  • defines: ファイルの解析中に IntelliSense エンジンが使用するプリプロセッサ定義のリストです。オプションで = を使用して値を設定できます (例: VERSION=1)。

  • cStandard: IntelliSense に使用する C 言語標準のバージョンです。例: c17gnu23、または ${default}。注: GNU 標準は、設定されたコンパイラに問い合わせて GNU define を取得するためにのみ使用され、IntelliSense は同等の C 標準バージョンをエミュレートします。

  • cppStandard: IntelliSense に使用する C++ 言語標準のバージョンです。例: c++20gnu++23、または ${default}。注: GNU 標準は、設定されたコンパイラに問い合わせて GNU define を取得するためにのみ使用され、IntelliSense は同等の C++ 標準バージョンをエミュレートします。

  • configurationProvider: ソース ファイルの IntelliSense 構成情報を提供できる VS Code 拡張機能の ID です。たとえば、CMake Tools 拡張機能から構成情報を提供するには、VS Code 拡張機能 ID ms-vscode.cmake-tools を使用します。configurationProvider を指定した場合、それが提供する構成は c_cpp_properties.json の他の設定よりも優先されます。

    configurationProvider の候補となる拡張機能は、vscode-cpptools-api を実装している必要があります。

  • mergeConfigurations: true に設定すると、インクルード パス、define、および強制インクルードを、構成プロバイダーからのものとマージします。

  • windowsSdkVersion: Windows で使用する Windows SDK インクルード パスのバージョンです (例: 10.0.17134.0)。

  • macFrameworkPath: Mac フレームワークからインクルードされたヘッダーを検索する際に IntelliSense エンジンが使用するパスのリストです。

  • forcedInclude: ソース ファイル内のテキストが処理される前にインクルードされるべきファイルのリストです。ファイルはリストされている順序でインクルードされます。

  • compileCommands: ワークスペースの compile_commands.json ファイルへのフル パスを含むパスの配列です。エディターで開かれているファイルに対応するエントリが compile_commands.json にある場合、c_cpp_properties.json の他のフィールドの代わりに、そのコマンド ラインがそのファイルの IntelliSense の構成に使用されます。ファイル形式の詳細については、Clang のドキュメント を参照してください。CMake のような一部のビルド システムは、このファイルの生成を簡素化します

  • dotConfig: Kconfig システムによって作成された .config ファイルへのパスです。Kconfig システムは、プロジェクトのビルドに必要なすべての define を含むファイルを生成します。Kconfig システムを使用するプロジェクトの例には、Linux Kernel や NuttX RTOS があります。

  • customConfigurationVariables: launch.jsontasks.json の入力変数として使用するために、コマンド ${cpptools:activeConfigCustomVariable} を通じてクエリできるカスタム変数です。

  • browse: コードベース内のすべてのシンボルを識別するために IntelliSense と共に使用されるプロパティのセットです。これらのプロパティは、[定義へ移動]/[宣言へ移動]、グローバル シンボル検索などの機能、または「既定」の IntelliSense エンジンがソース ファイルの #includes を解決できない場合に使用されます。

  • recursiveIncludes: 再帰検索を指定する includePath エントリを拡張機能がどのように処理するかを構成するために使用されるプロパティのセットです。

Browse プロパティ

  • path: グローバル シンボル検索で使用するためにソース ファイルが解析されるパスのリストです。省略された場合、includePathpath として使用されます。これらのパスの検索は既定で再帰的です。非再帰的な検索を示すには * を指定します。たとえば、${workspaceFolder} はすべてのサブディレクトリを検索しますが、${workspaceFolder}/* は検索しません。

  • limitSymbolsToIncludedHeaders: true の場合、タグ パーサーは ${workspaceFolder} 内のソース ファイルによって直接または間接的にインクルードされているヘッダー ファイルのみを解析します。false の場合、タグ パーサーは browse.path リストで指定されたパスで見つかったすべてのコード ファイルを解析します。

  • databaseFilename: 生成されるシンボル データベースへのパスです。このプロパティは、ワークスペースの既定の保存場所とは別の場所にワークスペース シンボル データベースを保存するように拡張機能に指示します。相対パスが指定された場合、それはワークスペース フォルダ自体ではなく、ワークスペースの既定の保存場所からの相対パスになります。${workspaceFolder} 変数を使用して、ワークスペース フォルダからの相対パスを指定できます (例: ${workspaceFolder}/.vscode/browse.vc.db)。

再帰インクルード プロパティ

  • reduce: 再帰的な includePath エントリが展開されると、ソース ファイル内の #include 文を解決する際に IntelliSense が処理するインクルード パスのセットが非常に大きくなる可能性があります。大量のインクルード パスを IntelliSense コンパイラに送信すると、一部のシステムでは IntelliSense のパフォーマンスに影響を与える可能性があります。既定では、拡張機能は、最初にソース ファイルをタグ解析して #include 文を検索し、どのインクルード パスが必要かを判断することで、インクルード パスのセットを可能な限り最小限に削減します。この削減プロセスは、この設定の always オプションと同じ動作です。この動作は、後で IntelliSense を高速化できる可能性のために、初期のオーバーヘッドを犠牲にします。このプロパティを never に設定すると、インクルード パスの完全な再帰的展開が IntelliSense プロセスに提供されます。事前にファイルを解析しないことで、この動作は、ソース ファイルが開かれたときに IntelliSense をより速く起動できるようにするために、後で起こりうるパフォーマンスの低下を犠牲にします。一般的に、構成内の再帰的なインクルード パスの数を減らすと、多数のパスが関与する場合に IntelliSense のパフォーマンスが向上する可能性があります。

  • priority: #include 文を解決する際の再帰的インクルード パス検索の優先順位です。beforeSystemIncludes に設定すると、再帰的インクルード パスはシステムのインクルード パスの前に検索されます。afterSystemIncludes に設定すると、再帰的インクルード パスはシステムのインクルード パスの後に検索されます。beforeSystemIncludes はコンパイラの検索順序をより忠実に反映し、予測可能性を高めますが、afterSystemIncludes はパフォーマンスの向上につながる可能性があります。

  • order: 再帰インクルードのサブディレクトリを breadthFirst (幅優先) で検索するか depthFirst (深さ優先) で検索するか。

サポートされている変数

tasks.json または launch.json で、c_cpp_properties.json から現在アクティブな構成をクエリできます。これを行うには、tasks.json または launch.json スクリプトの引数として変数 ${command:cpptools.activeConfigName} を使用します。

VS Code の既定の設定

C_Cpp.default.includePath のようなすべての VS Code の既定の設定は、c_cpp_properties.json でサポートされています。唯一の例外は

C_Cpp.default.systemIncludePath : string[]

この設定により、システムのインクルード パスをインクルード パスとは別に指定できます。ただし、C++ 拡張機能がコンパイラから受け取る選択されたシステムのインクルード パスは IntelliSense プロセスに渡されません。これは、コンパイラがサポートされていない場合など、標準のコンパイラの動作を上書きするため、まれなシナリオでのみ使用されます。代わりに、compilerArgs 設定を使用し、-isystem フラグを使用してシステム ヘッダーを指定する方が、ほとんどのシナリオでより良い解決策です。