web-dev-qa-db-ja.com

フルパスでのC ++インクルード

私は#include "../app/thing.h"を非常に醜く見つけ、次のようにプロジェクトのメインルートからインポートできるようにしたいと思います。

#include <project/app/submodule/thing.h>

(<>は一般的に外部で使用されることは知っていますが、非常にすっきりしています)

プロジェクトのどこからでもそれを行うにはどうすればよいですか?

11
tgy

ビルドプロセスが検索の開始点を指定するオプションを設定していることを確認する必要があるだけです。

たとえば、ヘッダーが次の場所にある場合:

/work/username/src/project/app/submodule/thing.h

次に、以下を含める必要があります(POSIX準拠のコンパイラを想定。AFAICR。MSVCでも/I-Iの類似物として使用します):

-I/work/username/src

コンパイラー・オプションの1つとして。このパスは絶対パスであるため、プロジェクトのどこからでも使用できます。ビルドシステムが設定を認識するための定義された方法が必要なだけなので、/home/someone/src/に移動したときに変更する設定は1つだけです。

5

現在のコンパイラ(通常は-I)のincludeディレクトリオプションを使用するだけで、これを実現できます。

また、""の二重引用符を使用すると、コンパイラの標準ヘッダーのフォールバックが追加されるだけです。 <>を使用してインクルードされたファイルは、コンパイラの標準ヘッダーからのファイルの検索のみが保証されています。

1

2つの形式の違いがどのように機能するかについてのより完全な説明については、 この答え を参照してください。正直なところ、フォルダーをジャンプして別のフォルダーにジャンプして何かを取得する必要がある場合は、フォルダー階層の再構築を検討することをお勧めします。一般的に言って、プログラムのローカルファイルすべてをフォルダー構造(つまり、同じフォルダー内)で互いにローカルに保ち、ローカルではないが必要になる可能性があるすべてのファイル(ヘッダーファイルなど)使用されるライブラリ)メインプログラムフォルダー内のサブフォルダー、またはコンパイル時にそれらを含めるため。

上記でリンクした回答では、「<>」インクルードは実装に依存していることを説明しているため、重要なのは、実行できるコンパイラとできないコンパイラを知るために、どのコンパイラを使用しているかを知る必要があるということです。それ。

1
Gurgadurgen