私はこれに対する答えを見つけるためにC++プログラミング言語を調べました。ヘッダーに#include "my_dir/my_header.hpp"
入ると、このファイルはどこで検索されますか?ヘッダーに関連するのか、それを含むソースファイルに関連するのか、それとも他の何かに関連するのでしょうか。
6 に答える
これは、現在のソース ファイルと指定された検索パスの両方に対して相対的です (gcc の場合は -I)。
#include ディレクティブで使用する構文によって異なります。
#include "path-spec"
#include <path-spec>
引用形式 : この形式は、#include ステートメントを含むファイルと同じディレクトリでインクルード ファイルを検索し、次にそのファイルをインクルード (#include) するすべてのファイルのディレクトリでインクルード ファイルを検索するようにプリプロセッサに指示します。次に、プリプロセッサは、/I コンパイラ オプションで指定されたパスに沿って検索し、次に INCLUDE 環境変数で指定されたパスに沿って検索します。
山かっこ形式 : この形式は、最初に /I コンパイラ オプションで指定されたパスに沿ってインクルード ファイルを検索し、次にコマンド ラインからコンパイルするときに、INCLUDE 環境変数で指定されたパスに沿ってインクルード ファイルを検索するようにプリプロセッサに指示します。
path-spec は、オプションでディレクトリ指定が前に付いたファイル名です。ファイル名は既存のファイル名でなければなりません。path-spec の構文は、プログラムがコンパイルされるオペレーティング システムによって異なります。
この情報は、特定の C++ プリプロセッサ リファレンスのドキュメントに記載されている必要があります。上記は、この件に関する詳細が記載されている MSDN の記事から取得したものです。
完全な検索パスは、コンパイラによって異なる場合があります。Visual Studio の場合、ドキュメントには次のように記載されています。
(...) は、#include ステートメントを含むファイルと同じディレクトリでインクルード ファイルを検索し、次にそのファイルをインクルード (#include) するすべてのファイルのディレクトリでインクルード ファイルを検索するようにプリプロセッサに指示します。次に、プリプロセッサは、/I コンパイラ オプションで指定されたパスに沿って検索し、次に INCLUDE 環境変数で指定されたパスに沿って検索します。
その実装が定義されています。ファイル(たとえば、foo.h)上のこれらの#include "my_dir / xxy.hpp"は、ファイルに対して相対的です(foo.hとmy_dirは、ディレクトリ階層の同じレベルにあります)。一部の(ほとんどの?)コンパイラでは、フラグを使用してこれらの<>(#include
gcc /g++が-Iフラグを提供することを私は知っています。したがって、g ++ -I / home [...]を使用して、xxy.hppファイルが/ home /my_dir/ディレクトリにあることを示すことができます。私はしばらくの間、他のC /C++コンパイラを使用していません。
GCC バージョン <= 3.0 の場合、山かっこ形式は、インクルード ファイルとインクルード ファイルの間に依存関係を生成しません。そのため、makefile で依存関係を自動的に生成する場合は、依存関係ツリーに含める必要があるファイルを引用形式で指定する必要があります。