参照しているドキュメント ページ ( http://clang.llvm.org/docs/Modules.html ) に記載されている内容は、実際にはモジュール TS ではありません。
プリコンパイルされたヘッダー インフラストラクチャを活用してモジュール的に再利用できるようにするのは、clang の非標準的なハックです。秘訣は、単純に、プリコンパイル済みヘッダーを任意の順序でロードできるようにすることです。また、一部のコードを既に解析した後にロードすることもできます。これは、以前に解析/ロードされたコードが、さらにプリコンパイルされたコードの副作用を持ってはならないという前提に基づいています。他のより伝統的な PCH の処理は、この点であまりにも衒学的であると見なすことができ、最初にロードする必要がある 1 つのモノリシック PCH (MSVC など) または固定順序 (GCC) を持つ PCH のチェーン。
@import
Objective-C 言語は、対応するファイルにリストされているすべてのファイルを効果的に「含める」キーワードで拡張されmodule.modulemap
ます (実際には、対応する PCH ファイルを生成および/またはロードすることを意味します)。
Objective-C 拡張機能が有効になっていない場合、import
キーワードはありませんが、まだ別のトリックがあります。#include
プリプロセッサ ディレクティブをインターセプトして、代わりに、対応するファイルにリストされているすべてのファイルを「含める」ようにしmodule.modulemap
ます (これは、実際には、生成することを意味します)。および/または対応する PCH ファイルをロードします)。
module
andexport
キーワードはありません(これらはmodule.modulemap
ファイルにのみ表示されます)。すべてがエクスポートされます。
このモジュラー PCH ハックは、-fmodules
コンパイラ フラグで有効になります。
これは、大規模なコードベースのビルド プロセスを高速化するのに役立つという点で価値があり、また、全世界を即座に書き直す必要なく、古いコードベースを将来のモジュール構造に移行する準備を怠らずに行うこともできます。
必要に応じてバグを修正できる知識豊富なclang開発者がいるグーグルのような非常に関与しているいくつかの企業を除いて、それが本番環境であまり使用されているとは思えません.
コードをこのシステムで実際に動作させるには、次のいずれかを行う必要があります。
最初の使用法では、コードにディレクティブを記述しなくても-I
、システムが内部でプリプロセッサ パス上のファイルを検索するため、プリプロセッサ インクルード パスを正しく設定することの重要性に注意してください。module.modulemap
#include
技術的には、モジュール システムが効果的に有効化されたことを確認するには、生成された PCH ファイル/tmp/org.llvm.clang.$USER/ModuleCache/
をCatch-$HASHSUM.pcm
. PCH は使用されたコンパイラ オプション (上記の例での Objective-C のサポートなど) に (とりわけ) 依存しているため、同じモジュールに対して複数のオプションが作成される可能性があります。Clang は、このキャッシュ ディレクトリを単独で管理します。古い未使用のファイルも削除します(とにかく/tmp/
、ブート中に消去されます).
お気づきのように、新しい-fmodules-ts
コンパイラ フラグは、私たちが探している将来のモジュール TS サポートを効果的に要求します。現在はほとんど使用されていないことに注意してください。
それを使用する方法に関する質問は、すでに尋ねられ、回答されています: Clangs C++ Module TS support: How to tell clang++ where to find the module file?