この素晴らしい記事(プリコンパイル済みヘッダーのケアとフィード) を読んだ後、これらが実際にどのように機能するかについて疑問が生じました。より具体的には、次のシナリオでプリコンパイル済みヘッダーの再構築をトリガーする必要があることをどのように知ることができますか:
#define
.cpp ファイルの 1 つに、プリコンパイル済みヘッダーに既に含まれている一部のヘッダーをプリプロセッサが解釈する方法を変更することにしました。#define
プリコンパイル済みヘッダーに既に含まれているヘッダーをプリプロセッサが解釈する方法を変更する特定のプリプロセッサ ディレクティブである .cpp ファイルの 1 つに別のヘッダーを含めます。#include
さらに悪いことに、特定のヘッダーが他のヘッダーである場合、前の問題が再帰的に発生する可能性があります。
プリコンパイル済みヘッダーを使用する場合、.cpp ファイルに含まれるヘッダーの数を 1 つに制限し、.cpp ファイルに何も含めないなど、特定の制限のあるコーディング スタイルを適用する必要があり#define
ますか?
Microsoft のコンパイラは、(MS 固有の voodoo を適用することによって) プリコンパイルされたヘッダーでおそらくまともな仕事をしますが、私の知る限り、すべての配管を行うはずの/Yc
and/Yu
オプションを提供するため、GCC の場合、これは機能には Makefile で多くの手作業と創造性が必要であり、プリコンパイル済みヘッダーを使用することのすべての落とし穴に対処することになっているテンプレートを見つけることができませんでした。
たとえば、いくつかのライブラリをビルドするプロジェクトがある場合、変更のたびにそれらすべてを再ビルドしないようにするために、現在のライブラリによって d されたヘッダーの 1 つが変更されたかどうかを検出するために Makefile でいくつかの本当にかわいいsed
トリック#include
を使用する必要があります。 (または#include
変更されたヘッダー)。ビルドスクリプトが必要なたびにヘッダーを再構築するために、事前に構築されたヘッダーが実際に意味する複雑さについて考えるのさえ怖いです。