人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: Sampo
●カテゴリ:コンピュータ
✍キーワード:C/C++ Common K&R ディレクトリ ファイル
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● taroe
●40ポイント ベストアンサー

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

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

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

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

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

◎質問者からの返答

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

ありがとうございます。

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


2 ● JULY
●0ポイント

通常は、

  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 を探す事になります。

◎質問者からの返答

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


3 ● wd0
●50ポイント

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

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...

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ