コンパイラがfoo.cc
。という名前のファイルをコンパイルしようとしました。行番号を押すline
と、コンパイラは次のことを検出します。
#include "bar"
または
#include <bar>
次に、コンパイラはそのファイルを見つけようとします。このため、ディレクトリのセットを使用して調べますが、このセット内にはファイルはありませんbar
。includeステートメントのバージョン間の違いの説明については、こちらをご覧ください。
コンパイラにそれを見つける方法を伝える方法
g++
オプションがあります-I
。コマンドラインにインクルード検索パスを追加できます。ファイルbar
がfrobnicate
、に関連する、という名前のフォルダにあると想像してくださいfoo.cc
(foo.cc
が配置されているディレクトリからコンパイルしていると仮定します)。
g++ -Ifrobnicate foo.cc
インクルードパスをさらに追加できます。あなたが与えるそれぞれは、現在のディレクトリに関連しています。Microsoftのコンパイラには/I
、同じように機能する相関オプションがあります。またはVisual Studioでは、フォルダはプロジェクトのプロパティページの[構成プロパティ]-> [C / C ++]-> [一般]-> [追加のインクルードディレクトリ]で設定できます。
ここで、次のようにbar
、異なるフォルダに複数のバージョンがあると想像してください。
#include<string>
std::string which() { return "A/bar"; }
#include<string>
std::string which() { return "B/bar"; }
#include<string>
std::string which() { return "C/bar"; }
#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
、ファイルlist
をプロジェクトフォルダには、それが現在コンパイルしているためmain.cc
、そのファイルが存在しlist
、現在のフォルダ内に。
しかしと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.
フォルダー.
よりもフォルダーが優先され、コンパイラエラーが発生します。