- ベストアンサー
#include <stdio.h>
#include <stdio.h>の <> の意味と #include "xxxxx.h"の "" の意味を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
厳密な定義を、「JIS X3010:2003 - 6.10.2 ソースファイル取り込み」から引用します。 ---- 引用ここから ---- 制約 #include指令は, 処理系で処理可能なヘッダ又はソースファイルを識別しなければならない。 意味規則 次の形式の前処理指令 # include <h文字列> 改行 は, 処理系定義の場所を順に探索して, <区切り記号と>区切り記号の間で指定した文字列で一意に決まるヘッダを見つけ, そのヘッダの内容全体でこの指令を置き換える。どのようにして探索の場所を指定するか, またどのようにしてヘッダを識別するかは, 処理系定義とする。 次の形式 # include "q文字列" 改行 は, 二つの"区切り文字の間で指定した文字列で一意に決まるソースファイルの内容全体で, この指令を置き換える。指定したソースファイルの探索順序は処理系定義とする。この探索をサポートしていない場合, 又は探索が失敗した場合, 同じ文字列(もしあれば>文字を含めて)を含む次の知れに読み替えたのと同じ規則で再処理する。 # include <h文字列> 改行 ---- 引用ここまで ---- 要するに、<xxx>の場合は処理系定義のヘッダ(ファイルとは限らない)を取り込み、"xxx"の場合はソースファイルを取り込むということです。いずれも探索場所やその順序は処理系定義です。 よくある誤解は、 ・ヘッダは必ずファイルである。 ・"xxx"ではカレントディレクトリや取り込もうとしたファイルと同じディレクトリから探索を始める。 といったものです。このように実装されている処理系が多いことは確かですが、標準規格ではそのような規定はありません。 使用している処理系がどのような実装になっているかは、マニュアルに記載があるかと思います。
その他の回答 (4)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
実質的な意味は既に回答されているとおりです。 ANSI の規定では、 #include <....> は、「処理系(コンパイラ)の規定の順序でファイルを検索する」 #include "....." は、「最初に、ソースファイルの存在しているディレクトリを検索し、存在しなければ、処理系の規定の順序でファイルを検索する」 という動きをします。 これを使うと、 ・プロジェクトで共通して使うファイルを、処理系のインクルードのパスに含めておく ・その共通ファイルを修正・変更するときには、テストプログラムと同じディレクトリにおいて、#include "...." ・テストが終わったら、晴れて、プロジェクトの共通ディレクトリに加える というような手順で、同じ名前のインクルードファイルを、名前の衝突を気にしないで、修正・テストしながら、他の人たちは、従来のファイルを使うことが出来ます。
お礼
ご返答ありがとうございました。
- toysmith
- ベストアンサー率37% (570/1525)
コンパイラによって違いがあるので、ゼッタイとは言い切れませんが、伝統的なルールは以下のようになります。 ようするにインクルードファイルを検索する場所の違いです。 ・ファイル名を<>で囲んだ#includeディレクティブ 環境変数が使える理系では環境変数INCLUDEに設定されたディレクトリからインクルードファイルを検索する。 環境変数の使えない処理系ではコンパイラの設定ファイルなどで指定したディレクトリからインクルードファイルを検索する。 ・ファイル名を<>で囲んだ#includeディレクティブ 1.コンパイル時のカレントワーキングディレクトリ 2.コンパイルオプションで指定したディレクトリ(一般的に-Iオプション) 3.ファイル名を<>で囲んだ#includeディレクティブで指定した場合に検索されるディレクトリ 以上の順番でインクルードファイルを検索します。
お礼
ご返答ありがとうございました。
補足
ご返答、ありがとうございます。 現在、独学中なので、少し難しいです。 >1.コンパイル時のカレントワーキングディレクトリ 2.コンパイルオプションで指定したディレクトリ(一般的に-Iオプション) 3.ファイル名を<>で囲んだ#includeディレクティブで指定した場合に検索されるディレクトリ というところがいまいちわかりません。 小学生位でも理解できるように噛み砕いていただけたらうれしいです。
- Senna_FF
- ベストアンサー率45% (153/334)
<>で囲むものは、そのコンパイル環境のライブラリのもつ 標準機能を記した標準ヘッダファイルを示します。 ""で囲むものは、自作したライブラリ用ヘッダです。 ヘッダのサーチ方が違うんですね。<>はコンパイラ環境の定義パスを検索するのに対し、 ""はコンパイル時のカレントパスをサーチ→定義パスをサーチみたいな感じ。 意味としては、ただその区別をつけるためです。(暗黙のルールみたいなもの?インクルード順を間違えないためとか言われてますけど) ちなみに、コンパイル用環境で、ヘッダファイルのパスが全て通っているならば、 <>でかいても、""で書いてもコンパイルは可能です。 「includeプリプロセッサ」とかでWeb検索すると、詳しく解説されているページが見つかると思います。
お礼
ご返答ありがとうございました。
補足
ご返答ありがとうございます。 現在、独学中なのであまり言葉の意味がわかりません。 >""はコンパイル時のカレントパスをサーチ→定義パスをサーチみたいな感じ。 というところがいまいちよくわからないでので、 もう少し噛み砕いてお願いできますでしょうか。
- liar_adan
- ベストアンサー率48% (730/1515)
お答えします。 <>で囲まれた場合は、コンパイラに備え付けのヘッダファイルをインクルードします。 通常、コンパイラがインストールされたディレクトリの中に、 INCLUDEというようなディレクトリがあって、 その中から読み取ります。 対して、 ""で囲まれた場合は、 プログラマが自分で作った物や、 標準以外のヘッダファイルをインストールするときに使います。 通常はカレントディレクトリにあるヘッダファイルをインクルードすると思います。
お礼
ご返答ありがとうございました。
補足
ご返答ありがとうございます。 <>の中に自作のヘッダファイルを保存したら、 <>でも呼べるんでしょうか?
お礼
ご返答ありがとうございました。