C++ header-units.json のリファレンス
このファイルには header-units.json
、次の 2 つの目的があります。
- 指定時
/translateInclude
にヘッダー単位に変換できるヘッダー ファイルを指定します。 - 重複するシンボルを最小限に抑えて、ビルドのスループットを向上させます。
このファイルは、含まれているヘッダー ファイルと同じディレクトリに存在する必要があります。 このファイルは、いずれか/scanDependencies
または/sourceDependencies:directives
一緒に指定されている場合/translateInclude
にのみ使用されます。
理由
一部のヘッダー ファイルは、ヘッダー ユニットに安全に変換できません。 コマンド ラインで定義されていないマクロに依存するヘッダー ファイル、またはヘッダーに含まれるヘッダー ファイルで定義されていないヘッダー ファイルは、ヘッダー ユニットに変換できません。
ヘッダーが他のヘッダーを含めるかどうかに影響するマクロを定義している場合、安全に変換することはできません。 たとえば、 a.h
すべて同じディレクトリ内にある場合 b.h
、次 macros.h
のようになります。
// a.h
#include "macros.h" // #defines MACRO=1
#ifdef MACRO
#include "b.h"
#endif
header-units.json
このディレクトリには、次を含b.h
a.h
めることができますが、含まれませんmacros.h
。 header-units.json
この例は次のようになります。
{
"Version": "1.0",
"BuildAsHeaderUnits": [
// macros.h should not be listed
"a.h",
"b.h"
]
}
このheader-units.json
ファイルに一覧表示できない理由macros.h
は、スキャン フェーズ中にヘッダー ユニット (.ifc
) がまだmacros.h
コンパイルされていない可能性があるためです。 その場合、 MACRO
コンパイル時 a.h
には定義されません。 b.h
つまり、依存関係a.h
の一覧には表示されません。 依存関係の一覧に含まれていないため、ビルド システムでは、ファイルに一覧表示されているにもかかわらず、ヘッダー ユニット b.h
は header-units.json
ビルドされません。
この問題を回避するために、別のヘッダー ファイル内のマクロに依存関係がある場合、そのマクロを定義するヘッダー ファイルは、ヘッダー ユニットにコンパイルできるファイルの一覧から除外されます。 このように、マクロを定義するヘッダー ファイルは通常#include
MACRO
のファイルとして扱われ、依存関係の 1 つとして含まれて一覧表示されるようにb.h
表示されます。
重複するシンボルの防止
また header-units.json
、重複したシンボルを使用せずにヘッダー ユニットを自動的に作成できるため、このファイルも重要です。 これは、次に示す header-units.json
ファイルの "アトミック" ヘッダー ユニットを作成することによって行われます。 インポートされたヘッダー ユニットには、ヘッダー ファイルの変換中に処理されたさまざまな #include
ディレクティブの重複したシンボルは含まれません。
たとえば、両方に共通のヘッダー ファイルを含む 2 つのヘッダー ファイルがあるとします。 両方のヘッダー ファイルは、同じソース ファイルに含まれています。
// a.h
#include "b.h"
// c.h
#include "b.h"
// Source.cpp
import "a.h";
import "c.h";
コンパイラが 、b.h
およびコンパイルされたヘッダー ユニットに対a.h
してc.h
ヘッダー ユニットをビルドし、b.h.ifc
c.h.ifc
それぞれのヘッダー ユニットa.h.ifc
に含まれるすべての型b.h
が含まれる場合。 両方a.h
c.h
をSource.cpp
インポートするコンパイルでは、コンパイラが型を重複b.h
除去する必要があり、ビルドのパフォーマンスに影響します。
ただし、ディレクトリにb.h
存在header-units.json
し/translateInclude
、指定されている場合は、次の処理が行われます。
- コンパイラによって生成された依存関係スキャン ファイル内のヘッダー ユニット インポートのスキャン
a.h
とc.h
一覧b.h
。 - ビルド システムは依存関係スキャン ファイルを読み取り、最初にビルド
b.h.ifc
することを決定します。 - その後、ビルド システムがコンパイル
a.h
用のコマンド ラインに追加/headerUnit
b.h.ifc
され、.c.h
コンパイラを呼び出してヘッダー ユニットa.h.ifc
とc.h.ifc
./translateInclude
指定され/headerUnit for b.h.ifc
、指定され、c.h.ifc
a.h.ifc
型が含b.h
まれていないため、生成されたヘッダー ユニットに重複はありません。
[スキーマ]
headerunits.json
標準テンプレート ライブラリ (STL) ヘッダー用のファイルがあります。 ビルド システムはそれを使用して、STL ヘッダー ファイルとその依存関係のヘッダー ユニットを作成するかどうかを決定します。 STL ヘッダー ファイルがリストにない場合、ヘッダー ユニットとしてインポートするのではなく、通常の #include
ファイルとして扱われます。
Visual Studio の header-units.json
インストール ディレクトリの下にファイルが表示されます。 例: %ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.30.30705\include\header-units.json
ファイルは header-units.json
スキーマ バージョンで始まり、その後にヘッダー単位に組み込むことができるヘッダーのファイル名の配列が続きます。
スキーマでは、次に示すようにコメントもサポートされています。
{
"Version": "1.0",
"BuildAsHeaderUnits": [
// "__msvc_all_public_headers.hpp", // for testing, not production
"__msvc_system_error_abi.hpp",
"__msvc_tzdb.hpp",
"__msvc_xlocinfo_types.hpp",
"algorithm",
"any",
"array",
"atomic",
"barrier",
"bit",
"bitset",
// "cassert", // design is permanently incompatible with header units
...
}
規則の検索
コンパイラは、処理中のヘッダー ファイルと同じディレクトリでこのファイルを検索します。 ライブラリがサブディレクトリに編成されている場合、各サブディレクトリには独自のファイルが必要です header-units.json
。
関連項目
チュートリアル: STL ライブラリをヘッダ ーユニットとしてインポートする
チュートリアル: Visual C++ プロジェクトでヘッダー ユニットをビルドしてインポートする
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示