web-dev-qa-db-ja.com

#includeディレクティブ:どこを基準にしていますか?

私はC++プログラミング言語を調べて、これに対する答えを見つけようとしました。 #include "my_dir/my_header.hpp"ヘッダーで、このファイルはどこにありますか?それは、ヘッダー、それを含んでいたソースファイル、または何かに関連していますか?

42
rlbond

実装が定義されました。 #include <filename>と#include“ filename”の違いは何ですか を参照してください。

27
aib

現在のソースファイルと指定された検索パス(gccの場合は-I)の両方に相対的です。

#includeディレクティブで使用する構文によって異なります。

#include "path-spec"
#include <path-spec>

引用フォーム:このフォームは、#includeステートメントを含むファイルと同じディレクトリ内でインクルードファイルを検索し、次にそのファイルをインクルード(#include)するファイルのディレクトリ内でインクルードファイルを検索するように指示します。次に、プリプロセッサは、/ Iコンパイラオプションで指定されたパスに沿って検索し、次にINCLUDE環境変数で指定されたパスに沿って検索します。

山かっこ形式:この形式は、最初に/ Iコンパイラオプションで指定されたパスに沿ってインクルードファイルを検索し、次にコマンドラインからコンパイルするときに、INCLUDE環境変数で指定されたパスに沿ってインクルードファイルを検索するようにプリプロセッサに指示します。

Path-specは、オプションでディレクトリ指定が前に付いたファイル名です。ファイル名は、既存のファイルの名前でなければなりません。 path-specの構文は、プログラムがコンパイルされるオペレーティングシステムによって異なります。

この情報は、特定のC++プリプロセッサリファレンスのドキュメントにあるはずです。上記は、この件についてさらに詳しく説明している MSDNのこの記事 から引用したものです。

7
Peter McG

完全な検索パスは、コンパイラによって異なります。 Visual Studioの場合、 ドキュメント は次のように述べています。

(...)#includeステートメントを含むファイルと同じディレクトリでインクルードファイルを検索し、次にそのファイルをインクルード(#include)するファイルのディレクトリでインクルードファイルを検索するようにプリプロセッサに指示します。次に、プリプロセッサは、/ Iコンパイラオプションで指定されたパスに沿って検索し、次にINCLUDE環境変数で指定されたパスに沿って検索します。

3
noup

その実装が定義されました。ファイル(たとえば、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++コンパイラを使用していません。

1
Tom

gCCバージョン<= 3.0の場合、山かっこ形式は、インクルードファイルとインクルードファイルの間に依存関係を生成しません。したがって、makefileが依存関係を自動的に生成するようにしたい場合は、依存関係ツリーに含める必要のあるファイルに引用符で囲まれた形式を使用する必要があります。

0
Denis Ros