インクルードファイルを格納している場所を環境変数等に指定してコンパイラに知らせることがほとんどです。
で、質問文の場合、その場所とソースのCファイルの位置の両方から探しに行きます。
>K&Rを読んでもどちらとも取れる書き方でよくわかりません。
どちらからも探すので、正しいです。
インクルードファイルを格納している場所を環境変数等に指定してコンパイラに知らせることがほとんどです。
で、質問文の場合、その場所とソースのCファイルの位置の両方から探しに行きます。
>K&Rを読んでもどちらとも取れる書き方でよくわかりません。
どちらからも探すので、正しいです。
両方の位置から。なるほど、合点がゆきました。
ありがとうございます。
すると興味が湧いてくるのが、両方の位置を基準にそれぞれ別の(同名の)ヘッダファイルが見つかってしまう場合どちらが優先されるのだろうという疑問ですが、これについてはなにか決まりですとかあるのでしょうか? これはさすがに実装依存かな…
通常は、
の順序で探します。
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 を探す事になります。
質問文を理解した上での回答をお願いします。
はい、実装依存です。実装依存であることが、言語仕様で明確に決まっています。
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...
突っ込んでの調査ありがとうございました。非常にすっきりしました。
両方の位置から。なるほど、合点がゆきました。
ありがとうございます。
すると興味が湧いてくるのが、両方の位置を基準にそれぞれ別の(同名の)ヘッダファイルが見つかってしまう場合どちらが優先されるのだろうという疑問ですが、これについてはなにか決まりですとかあるのでしょうか? これはさすがに実装依存かな…