たとえば、タプルのドキュメントで使用するように指示されているのはなぜですか。
#include "boost/tuple/tuple.hpp"
ではない
#include <boost/tuple/tuple.hpp>
私のコードに「boost/tuple/tuple.hpp」というファイルが含まれる可能性は低いことはわかっていますが、include <> を使用すると、現在のディレクトリを参照しないように明示的に指定されています。
では、その理由は何ですか?
たとえば、タプルのドキュメントで使用するように指示されているのはなぜですか。
#include "boost/tuple/tuple.hpp"
ではない
#include <boost/tuple/tuple.hpp>
私のコードに「boost/tuple/tuple.hpp」というファイルが含まれる可能性は低いことはわかっていますが、include <> を使用すると、現在のディレクトリを参照しないように明示的に指定されています。
では、その理由は何ですか?
<>を使用することは、「現在のディレクトリを調べない」ことを意味するのではありません。これは、実装で定義された場所を調べてから、実装が定義された別の場所を調べることを意味します。これらの両方またはどちらも現在のディレクトリではない可能性があります。これは、C++標準で最も役に立たないビットの1つです。
の歴史的な意味は<somefile>
、システム標準の場所を調べることです。これ"somefile"
は、現在のディレクトリと他の場所を調べることを意味します。
その理由は、アプリケーションに属するヘッダーと外部ライブラリに属するヘッダーを区別するためです。なぜ彼らがこの慣習を使わなかったのか、私にはわかりません。それは単なる慣習であり、規則ではありません。
おそらく、誰かが Boost のメンテナーにこの問題を提起する必要がありますか?
ブーストには <...> を使用します。これはあなたのコードではありません。あなたのコードが後押しされていない限り。
すべての C++ プログラムに必然的に含まれるヘッダー ファイルには、"...." を使用します。これは読者向けであり、コンパイラ向けではありません。
msdnから:
引用形式
このフォームは、プリプロセッサに、#includeステートメントを含むファイルの同じディレクトリでインクルードファイルを検索し、次にそのファイルをインクルードする(#include)ファイルのディレクトリで検索するように指示します。次に、プリプロセッサは/ Iコンパイラオプションで指定されたパスに沿って検索し、次にINCLUDE環境変数で指定されたパスに沿って検索します。
アングルブラケットフォーム
このフォームは、プリプロセッサに、最初に/ Iコンパイラオプションで指定されたパスに沿ってインクルードファイルを検索し、次にコマンドラインからコンパイルするときにINCLUDE環境変数で指定されたパスに沿ってインクルードファイルを検索するように指示します。
2つのインクルージョンのスタイルの違いは何か、またはBoostの論理的根拠について質問していますか?他の人が違いについて話しているので、私は後者の問題についての私の見解を追加します:
一般的に、どちらかがより正しいとは思いません。これは、依存関係に関してプロジェクトがどのように構成されているかによって異なります。たとえば、私のプロジェクトでは、通常、Boostなどの関連ビットをプロジェクトのサブディレクトリに含めているため、この#include ""
形式を好む傾向があります。よりグローバルな場所からBoostのインストールを取得する場合は、#include <>
フォームをお勧めします。