C/C++ のヘッダファイルの中で、別のヘッダファイルを相対パスで #include します。"../../common.h" など。このとき、相対パスの基準ディレクトリは大元の呼び出しもとCファイルの位置でしょうか、それともこれが記述してあるヘッダファイルの位置でしょうか。K&Rを読んでもどちらとも取れる書き方でよくわかりません。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2011/02/01 19:37:54
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taroe No.1

回答回数1099ベストアンサー獲得回数132

ポイント40pt

インクルードファイルを格納している場所を環境変数等に指定してコンパイラに知らせることがほとんどです。

で、質問文の場合、その場所とソースのCファイルの位置の両方から探しに行きます。

>K&Rを読んでもどちらとも取れる書き方でよくわかりません。

どちらからも探すので、正しいです。

http://q.hatena.ne.jp/answer

id:Sampo

両方の位置から。なるほど、合点がゆきました。

ありがとうございます。

すると興味が湧いてくるのが、両方の位置を基準にそれぞれ別の(同名の)ヘッダファイルが見つかってしまう場合どちらが優先されるのだろうという疑問ですが、これについてはなにか決まりですとかあるのでしょうか? これはさすがに実装依存かな…

2011/02/01 15:56:19

その他の回答2件)

id:taroe No.1

回答回数1099ベストアンサー獲得回数132ここでベストアンサー

ポイント40pt

インクルードファイルを格納している場所を環境変数等に指定してコンパイラに知らせることがほとんどです。

で、質問文の場合、その場所とソースのCファイルの位置の両方から探しに行きます。

>K&Rを読んでもどちらとも取れる書き方でよくわかりません。

どちらからも探すので、正しいです。

http://q.hatena.ne.jp/answer

id:Sampo

両方の位置から。なるほど、合点がゆきました。

ありがとうございます。

すると興味が湧いてくるのが、両方の位置を基準にそれぞれ別の(同名の)ヘッダファイルが見つかってしまう場合どちらが優先されるのだろうという疑問ですが、これについてはなにか決まりですとかあるのでしょうか? これはさすがに実装依存かな…

2011/02/01 15:56:19
id:JULY No.2

回答回数966ベストアンサー獲得回数247

通常は、

  1. コンパイラのオプションや環境変数に指定されたパス。
  2. コンパイラが持っているデフォルトのパス。

の順序で探します。

UNIX 系 OS で使われるコンパイラであれば、大抵は -I で指定しますが、このオプションは複数指定でき、指定された順序でヘッダファイルを探す事になります。

なので、同じファイル名のヘッダファイルがあれば、先に見つかったものが採用されます。

あと、#include は 「<>」でくくるか、「""」でくくるかで意味が変わります。「<>」でくくれば、指定されたパスとデフォルトのパス(UNIX 系であれば /usr/include)から探しますが、「""」でくくると、最初にコンパイル対象のソースファイルのあるディレクトリを探すようになります。

C言語のプリプロセスのメモ(Hishidama's C pre-process Memo)

なので、もし、

#include "../../common.h"

と書けば、そのソースファイルのあるディレクトリの、2つの上のディレクトリを最初に探す事になります。

あるいは、

#include <../../common.h>

と書いて、コンパイラに特定のパスを指定しないと、UNIX 系 OS であれば /usr/include/../../common.h、つまり、/common.h を探す事になります。

id:Sampo

質問文を理解した上での回答をお願いします。

2011/02/01 19:35:38
id:wd0 No.3

回答回数14ベストアンサー獲得回数2

ポイント50pt

はい、実装依存です。実装依存であることが、言語仕様で明確に決まっています。

JIS X 3010:2003 プログラム言語C の6.10.2節「ソースファイル取り込み」に、「指定したファイルの探索手順は処理系定義とする。」と明記されています。ちなみに、JIS X 3010:2003 は ISO/IEC 9899:1999 の日本語訳です。

http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=...

http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/J...

id:Sampo

突っ込んでの調査ありがとうございました。非常にすっきりしました。

2011/02/01 19:36:17
  • id:Sampo
    いるか賞を2本差し上げたかったのですがそうはいかないので、いるか賞/おまけポイントという形に振り分けさせていただきました。回答ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません