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

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2011/02/01 15:25:08
  • 終了:2011/02/01 19:37:54

ベストアンサー

id:taroe No.1

taroe回答回数1099ベストアンサー獲得回数1322011/02/01 15:41:04

ポイント40pt

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

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

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

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

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

id:Sampo

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

ありがとうございます。

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

2011/02/01 15:56:19

その他の回答(2件)

id:taroe No.1

taroe回答回数1099ベストアンサー獲得回数1322011/02/01 15:41:04ここでベストアンサー

ポイント40pt

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

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

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

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

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

id:Sampo

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

ありがとうございます。

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

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

JULY回答回数966ベストアンサー獲得回数2472011/02/01 16:59:28

通常は、

  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

wd0回答回数14ベストアンサー獲得回数22011/02/01 17:32:34

ポイント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本差し上げたかったのですがそうはいかないので、いるか賞/おまけポイントという形に振り分けさせていただきました。回答ありがとうございました。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません