C ++がインクルードを検索するすべての場所をチェックする方法はありますか?一部のインクルードが検出され、他のインクルードが検出されない理由を理解したいと思います。
編集:プラットフォームはLinux、g++です
C ++がインクルードを検索するすべての場所をチェックする方法はありますか?一部のインクルードが検出され、他のインクルードが検出されない理由を理解したいと思います。
編集:プラットフォームはLinux、g++です
これはコンパイラに依存します。角かっこでヘッダーの場所を渡し、二重引用符で囲まれたヘッダーは、現在のファイルの場所をルートとするパスにあると予想されます。コンパイラーでは、これらのファイルの追加の場所を指定することもできます。
たとえば、にgcc
は2つのオプションがあります--I
および-i
として指定されたヘッダーの場所を指定するためのオプションが<header.h>
あります"header.h"
。指定されていない場合-I
、のデフォルトの場所
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
ドキュメントで指定されているgcc
ように、検索されます。
16.2[cpp.include]はこれをC++用に定義します。Cの言語はほとんど同じです。
#include <header.h>
実装で定義された場所のセットで、その名前の「ヘッダー」を検索します。この「ヘッダー」はファイルである必要はありません。これは、コンパイラが魔法のように知っているものである可能性があります。
#include "header.h"
また、実装で定義された場所のセットを検索しますが、「header.h」という名前のファイルを検索します。その検索が失敗した場合、ディレクティブはとして扱われ#include <header.h>
ます。
多くのコンパイラは、「現在のディレクトリ」を調べることによって2番目の検索を実装します。これは、コンパイラによってはコンパイラが起動されたディレクトリを意味し、他のコンパイラでは、#include
ディレクティブを含むファイルが配置されているディレクトリを意味します。
一般に、ヘッダーの引用符付きフォームを使用する必要があります。アングルブラケットはファイルを必要としないため、実装で使用するために残しておく必要があります。独自のヘッダーに山かっこを使用しても機能しないわけではありませんが、テーマに反します。