※ ChatGPTを利用し、要約された質問です(原文:インクルードパスを相対パスで指定)
相対パスでのインクルードパス指定の正体とは?
このQ&Aのポイント
Visual C++ 2017を使用したプロジェクト開発で、相対パスを使用してインクルードパスを指定する方法について説明します。
プロジェクトファイルやソースファイルは開発用ディレクトリの直下にあり、その中にL2と同じ階層にあるincludeディレクトリが存在します。
インクルードディレクトリの指定やソースファイルからの相対パスの解釈により、コンパイルが通る理由やエラーが発生する理由についても解説します。
Visual C++ 2017を使用したプロジェクト開発で、次のようなディレクトリ構造になっているとします。
root/
└ dev/
└ L1/
├ L2/
│ ├ L3/
│ │ └ L4/
│ │ └ MyProj(開発用ディレクトリ)
│ └ foo/
│
└ include/
プロジェクトファイルやソースファイルは全てMyProjの直下にあります。
L2と同じ階層にあるincludeディレクトリにあるtest.hをソースファイルにインクルードするために、次のような#include文を記述します。
#include "../../../include/test.h"
これで問題なくコンパイルが通ります。
次に、プロジェクトのプロパティの「追加のインクルードディレクトリ」に"../../foo"を追加します。
これは次のようなオプションと解釈されてコンパイラに渡されます。
/I"../../foo"
fooというディレクトリのみを参照パスに追加するつもりで、プロジェクトファイルからの相対パスで指定しました。
さてここで#include文を次のように書き換えてみました。
#include "../../include/test.h"
これでコンパイルが通るのです。
ソースファイルからtest.hへの相対パスは
../../../include/test.h
のはずですが、なぜこれでコンパイルが通るのでしょうか?
ちなみに「追加のインクルードディレクトリ」に何も指定しない状態では、includeファイルを開けないと出てコンパイルエラーとなります。
なのでこの設定が影響しているのだとは思いますが。
お礼
なるほど、MSのサイトにも説明がありましたね。 インクルードパスが増えると検索の基準点も増えてしまい、特に相対パス指定の場合は直感的にどのフォルダが検索対象になっているのか把握しづらいですね。