コンパイラが。という名前のファイルをコンパイルしようとしましたfoo.cc。行番号を押すlineと、コンパイラは次のことを検出します。
#include "bar"
また
#include <bar>
次に、コンパイラはそのファイルを見つけようとします。このため、ディレクトリのセットを使用して調べますが、このセット内にはファイルはありませんbar。includeステートメントのバージョン間の違いの説明については、ここを参照してください。
コンパイラにそれを見つける方法を伝える方法
g++オプションがあります-I。コマンドラインにインクルード検索パスを追加できます。ファイルが、に関連する、barという名前のフォルダにあると想像してください(が配置されているディレクトリからコンパイルしていると仮定します)。frobnicatefoo.ccfoo.cc
g++ -Ifrobnicate foo.cc
さらにインクルードパスを追加できます。あなたが与えるそれぞれは、現在のディレクトリに相対的です。Microsoftのコンパイラには、同じように機能する相関オプション/Iがあります。またはVisual Studioでは、フォルダはプロジェクトのプロパティページの[構成のプロパティ]-> [C /C++]->[一般]->[追加のインクルードディレクトリ]で設定できます。
barここで、次のように、異なるフォルダに複数のバージョンがあると想像してください。
// A/bar
#include<string>
std::string which() { return "A/bar"; }
// B/bar
#include<string>
std::string which() { return "B/bar"; }
// C/bar
#include<string>
std::string which() { return "C/bar"; }
// foo.cc
#include "bar"
#include <iostream>
int main () {
std::cout << which() << std::endl;
}
の優先順位#include "bar"は左端です:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
ご覧のとおり、コンパイラが、、およびを調べ始めるA/とB/、C/最初または左端のヒットで停止しました。
これは、include <>との両方の形式に当てはまりますincude ""。
#include <bar>との違い#include "bar"
通常、は#include <xxx>最初にシステムフォルダを#include "xxx"調べ、は現在のフォルダまたはカスタムフォルダを最初に調べます。
例えば:
プロジェクトフォルダに次のファイルがあるとします。
list
main.cc
とmain.cc:
#include "list"
....
このため、コンパイラはプロジェクトフォルダ内#includeのファイルを作成します。これは、現在コンパイルされており、そのファイルが現在のフォルダにあるためです。listmain.cclist
しかしとmain.cc:
#include <list>
....
次にg++ main.cc、コンパイラは最初にシステムフォルダを調べます。これ<list>は標準ヘッダーであるため、C++プラットフォームに標準ライブラリの一部として付属している#includeという名前のファイルになります。list
これはすべて少し単純化されていますが、基本的な考え方がわかるはずです。
<>/ ""-prioritiesとの詳細-I
gcc-documentationによると、の優先順位include <>は、「通常のUnixシステム」では次のとおりです。
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
C ++プログラムの場合、最初に/ usr / include / c ++/versionも調べます。上記では、targetは、GCCがコードをコンパイルするように構成されたシステムの正規名です。[...]。
ドキュメントには次のようにも記載されています。
-Idirコマンドラインオプションを使用して、このリストに追加できます。-Iで指定されたすべてのディレクトリは、デフォルトのディレクトリの前に、左から右の順序で検索されます。唯一の例外は、デフォルトでdirがすでに検索されている場合です。この場合、このオプションは無視され、システムディレクトリの検索順序は変更されません。
例を続けるには#include<list> / #include"list"(同じコード):
g++ -I. main.cc
と
#include<list>
int main () { std::list<int> l; }
実際、システムに含まれる-I.フォルダよりもフォルダが優先.され、コンパイラエラーが発生します。