• ベストアンサー

#include <stdio.h>

#include <stdio.h>の <> の意味と #include "xxxxx.h"の "" の意味を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

厳密な定義を、「JIS X3010:2003 - 6.10.2 ソースファイル取り込み」から引用します。 ---- 引用ここから ---- 制約 #include指令は, 処理系で処理可能なヘッダ又はソースファイルを識別しなければならない。 意味規則 次の形式の前処理指令     # include <h文字列> 改行 は, 処理系定義の場所を順に探索して, <区切り記号と>区切り記号の間で指定した文字列で一意に決まるヘッダを見つけ, そのヘッダの内容全体でこの指令を置き換える。どのようにして探索の場所を指定するか, またどのようにしてヘッダを識別するかは, 処理系定義とする。  次の形式     # include "q文字列" 改行 は, 二つの"区切り文字の間で指定した文字列で一意に決まるソースファイルの内容全体で, この指令を置き換える。指定したソースファイルの探索順序は処理系定義とする。この探索をサポートしていない場合, 又は探索が失敗した場合, 同じ文字列(もしあれば>文字を含めて)を含む次の知れに読み替えたのと同じ規則で再処理する。     # include <h文字列> 改行 ---- 引用ここまで ---- 要するに、<xxx>の場合は処理系定義のヘッダ(ファイルとは限らない)を取り込み、"xxx"の場合はソースファイルを取り込むということです。いずれも探索場所やその順序は処理系定義です。 よくある誤解は、 ・ヘッダは必ずファイルである。 ・"xxx"ではカレントディレクトリや取り込もうとしたファイルと同じディレクトリから探索を始める。 といったものです。このように実装されている処理系が多いことは確かですが、標準規格ではそのような規定はありません。 使用している処理系がどのような実装になっているかは、マニュアルに記載があるかと思います。

moncyasan
質問者

お礼

ご返答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

実質的な意味は既に回答されているとおりです。 ANSI の規定では、 #include <....> は、「処理系(コンパイラ)の規定の順序でファイルを検索する」 #include "....." は、「最初に、ソースファイルの存在しているディレクトリを検索し、存在しなければ、処理系の規定の順序でファイルを検索する」 という動きをします。 これを使うと、 ・プロジェクトで共通して使うファイルを、処理系のインクルードのパスに含めておく ・その共通ファイルを修正・変更するときには、テストプログラムと同じディレクトリにおいて、#include "...." ・テストが終わったら、晴れて、プロジェクトの共通ディレクトリに加える というような手順で、同じ名前のインクルードファイルを、名前の衝突を気にしないで、修正・テストしながら、他の人たちは、従来のファイルを使うことが出来ます。

moncyasan
質問者

お礼

ご返答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

コンパイラによって違いがあるので、ゼッタイとは言い切れませんが、伝統的なルールは以下のようになります。 ようするにインクルードファイルを検索する場所の違いです。 ・ファイル名を<>で囲んだ#includeディレクティブ 環境変数が使える理系では環境変数INCLUDEに設定されたディレクトリからインクルードファイルを検索する。 環境変数の使えない処理系ではコンパイラの設定ファイルなどで指定したディレクトリからインクルードファイルを検索する。 ・ファイル名を<>で囲んだ#includeディレクティブ 1.コンパイル時のカレントワーキングディレクトリ 2.コンパイルオプションで指定したディレクトリ(一般的に-Iオプション) 3.ファイル名を<>で囲んだ#includeディレクティブで指定した場合に検索されるディレクトリ 以上の順番でインクルードファイルを検索します。

moncyasan
質問者

お礼

ご返答ありがとうございました。

moncyasan
質問者

補足

ご返答、ありがとうございます。 現在、独学中なので、少し難しいです。 >1.コンパイル時のカレントワーキングディレクトリ   2.コンパイルオプションで指定したディレクトリ(一般的に-Iオプション)  3.ファイル名を<>で囲んだ#includeディレクティブで指定した場合に検索されるディレクトリ というところがいまいちわかりません。 小学生位でも理解できるように噛み砕いていただけたらうれしいです。

全文を見る
すると、全ての回答が全文表示されます。
  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.2

<>で囲むものは、そのコンパイル環境のライブラリのもつ 標準機能を記した標準ヘッダファイルを示します。 ""で囲むものは、自作したライブラリ用ヘッダです。 ヘッダのサーチ方が違うんですね。<>はコンパイラ環境の定義パスを検索するのに対し、 ""はコンパイル時のカレントパスをサーチ→定義パスをサーチみたいな感じ。 意味としては、ただその区別をつけるためです。(暗黙のルールみたいなもの?インクルード順を間違えないためとか言われてますけど) ちなみに、コンパイル用環境で、ヘッダファイルのパスが全て通っているならば、 <>でかいても、""で書いてもコンパイルは可能です。 「includeプリプロセッサ」とかでWeb検索すると、詳しく解説されているページが見つかると思います。

moncyasan
質問者

お礼

ご返答ありがとうございました。

moncyasan
質問者

補足

ご返答ありがとうございます。 現在、独学中なのであまり言葉の意味がわかりません。 >""はコンパイル時のカレントパスをサーチ→定義パスをサーチみたいな感じ。 というところがいまいちよくわからないでので、 もう少し噛み砕いてお願いできますでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

お答えします。 <>で囲まれた場合は、コンパイラに備え付けのヘッダファイルをインクルードします。 通常、コンパイラがインストールされたディレクトリの中に、 INCLUDEというようなディレクトリがあって、 その中から読み取ります。 対して、 ""で囲まれた場合は、 プログラマが自分で作った物や、 標準以外のヘッダファイルをインストールするときに使います。 通常はカレントディレクトリにあるヘッダファイルをインクルードすると思います。

moncyasan
質問者

お礼

ご返答ありがとうございました。

moncyasan
質問者

補足

ご返答ありがとうございます。 <>の中に自作のヘッダファイルを保存したら、 <>でも呼べるんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • stdio.h について

    質問です。 Borland C++ Compiler 5.5 を使っているのですが…。 Includeの中にstdio.hのファイルがありません stdio.hのソースを教えて下さい!!

  • stdio.hは何のためにあるのでしょうか?

    stdio.hは何のためにあるのでしょうか? 標準関数をまとめたライブラリですが、 「標準」と呼ばれるぐらいなので、 includeしなくても使えるように最初からすればよいと思っています。

  •    #include<stdio.h>

       #include<stdio.h> #include<math.h> int main(void) { int i,n,limit; printf("data? "); scanf("%d",&n); i(n>=2){ limit=int)sqrt(n); for(i=limit;i1;i--){ if(n%i==0) break; } if(i==1) printf("素数\n); else printf("素数でない\n"); } return 0; } というプログラムがあるのですが、それを改良して int型(符号付32ビット整数)および、unsigned int型(符号なし32ビット整数)のそれぞれの最大の素数を求めよという問題があり、ただし、エラトステネスのふるいは使わずに、上のプログラムを改良してみよという問題がどっかにあったんですが、全然わからないので、教えてください。

  • #include<stdio.h>

    #include<stdio.h> main () { int a,b; printf("適当な数字\n"); scanf("%d %d",&a,&b); printf("(a*b)%(a+b)=%d\n",(a*b)/(a+b)); return (0); } で結果が 任意の数字 2 3 (a*b)(a+b)=1 ん なんですが違いますよね? 商の余りを求めるにはどう改変すればいいでしょうか?

  • #include <stdio.h>

    #include <stdio.h> struct st { char a[3]; short b; char c[7]; long d; char e[5]; }; int main(void) { printf("%d\n",sizeof(struct st)); return 0; } コンパイルオプションでアライメントを変化させながら(1,2,4,…) sizeof(struct st)の変化を見たいのですが、コンパイルする時に どのようにすれば良いのでしょうか?当方、gccを使用しております。 あと、ついでなんですが、警告オプションは-Wと-Wallしかないのでしょうか?

  • Visual C++ 2008で<stdio.h>のインクルード文が使えない!?

    #include <stdio.h> int main(){ printf("hello!"); } で実行すると、 : warning C4627: '#include <stdio.h>': プリコンパイル済みヘッダーの使用を検索中にスキップされました ディレクティブを 'stdafx.h' に追加するか、プリコンパイル済みヘッダーをビルドし直します .\■■■.cpp(5) : fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか? と言ったエラーが起きてしまいます。 ちなみに、インクルードファイルらしき物を削除しまくった覚えがあります…。100%これが原因かと。 これが原因だとしたらどうすればいいんでしょうか? あと、DXライブラリが使えるように設定を変えたこともあります。 どこの何を変えたかは忘れてしまいましたけど。

  • なぜgccはstdio.hをインクルードしなくてもprintfが実行できるのか

    なぜgccはstdio.hをインクルードしなくてもprintfが実行できるのでしょうか。 暗黙にインクルードされるヘッダと されないヘッダファイルの差分等あれば教えていただきたく。。 // main.c int main(){ printf("SWSW\n") ; return 0 ; } % gcc main.c % ./a.out SWSW

  • BCC・stdio.h・_stddef.hのエラー

    BCCと同梱されているstdio.hのエラーなのですが、 stdio.hのエラーは他では出なかったので、 ソース自体がおかしいのかと思っていますが、よく分かりません。 一応ソースを載せます。 #include <stdio.h> int main(int argc, char *argv[]) { if(argv[1] == "") { printf("---(Ver1.00.01)\n"); printf("easy.exe [filename]\n"); printf(" [filename] - ファイル名を指定してください.\n"); } return 0; } これによって次のエラーを吐いてきます。 エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\_stddef.h 53: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\_stddef.h 72: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 51: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 104: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 105: 宣言が正しく終了していない エラー E2293 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 140: ) が必要 エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 150: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 151: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 152: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 154: 宣言が正しく終了していない エラー E2293 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 155: ) が必要 エラー E2293 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 156: ) が必要 エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 160: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 161: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 162: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 164: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 165: 宣言が正しく終了していない エラー E2141 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 166: 宣言の構文エラー エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 172: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 173: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 174: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 175: 宣言が正しく終了していない エラー E2141 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 177: 宣言の構文エラー エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 181: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 188: 宣言が正しく終了していない エラー E2228 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 188: エラーあるいは警告が多すぎる stdio.h,_stddef.hのソースは一切変えたりしていません。 また、BCCのエラーは、stdio.hとprintfを抜いて int main(int argc, char *argv[]) { if(argv[1] == "") { } return 0; } としたときに 宣言が正しく終了していない と表示されます。 環境は WindowsXP SP1 BCC Developer です。 よろしくお願いします。

  • "stdio.h"と<stdio.h>の違い

    "stdio.h"と<stdio.h>の違いについて教えていただけないでしょうか? 両方とも同じと考えているのですが正しいでしょうか? 教えていただけないでしょうか?よろしくお願いします。

  • stdio.hからsyntax error??

    10日でおぼえるC言語教室という書籍を購入し、その通りにシステム環境変数の設定を行ったのですが、stdio.hに対してNo such file or directoryの様な?文が出てきてしまいました。 そこで自分なりに調べた結果、ネット上にC_INCLUDE_PATHとCPLUS_INCLUDE_PATHも追加で設定する必要があると書いてありました。 この時点ですでに???ですが…とりあえずやってみたところNo such~のエラーはでなくなりました。 ただ、代わりにsyntax errorなどの様なエラーが沢山出てきてしまいました。(しかし、exeファイルは出来ていて実行は可能です) 自分で書いたコードなら書き間違いだと思うのですが、stdio.hは付属のCDーROMからのものなのでミスは無いと思うのですが… OSはvistaで、CドライブとDドライブが入っているものです。 この書籍でのCコンパイラはMinGWです。書籍付属のCD-ROMからmingw-jpを任意の場所(今回はDドライブ→新規→プログラム→MinGWの中)にコピーしてシステム環境変数pathの設定を行うとgccでコンパイルが可能というものです。 ちなみにシステム環境変数pathに設定したbinというフォルダがあるのは、mingw-jpの中で、場所はDドライブ→新規→プログラム→MinGW→mingw-jp→binです。 変数pathに追加したのは ;D:\新規\プログラム\MinGW\mingw-jp\bin; です。 C_INCLUDE_PATHとCPLUS_INCLUDE_PATHは両方ともD:\新規\プログラム\MinGW\mingw-jp\includeと記述しました。stdio.hはincludeのフォルダの中にちゃんとありました。 実際はmingw-jpの中にcodeというフォルダを作り、その中にhelloというフォルダを作り中にhello.cを記述してあります 以下がエラーの一部です D:/新規\プログラム\MinGW\mingw-jp\include/stdio.h:206: error: syntax error before "size_t" D:/新規\プログラム\MinGW\mingw-jp\include/stdio.h:217: error: syntax error before "size_t" D:/新規\プログラム\MinGW\mingw-jp\include/stdio.h:218: error: syntax error before "__gnuc_va_list" D:/新規\プログラム\MinGW\mingw-jp\include/stdio.h:219: error: syntax error before "__gnuc_va_list" D:/新規\プログラム\MinGW\mingw-jp\include/stdio.h:220: error: syntax error before "__gnuc_va_list" D:/新規\プログラム\MinGW\mingw-jp\include/stdio.h:221: error: syntax error before "size_t" D:/新規\プログラム\MinGW\mingw-jp\include/stdio.h:224: error: syntax error before "size_t" D:/新規\プログラム\MinGW\mingw-jp\include/stdio.h:226: error: syntax error before "size_t" 実際はまだまだエラーが続いてます ここで 1.書籍にはシステム環境変数pathの設定のみしか書いてありませんでしたが、上記のNO~というエラーが出てしまいます。私の設定の仕方が悪いのでしょうか 2.C_INCLUDE_PATHとCPLUS_INCLUDE_PATHを追加すると1のエラーは無くなりましたがこれってどういう事なのでしょうか 3.stdio.hに対してエラーが沢山出ていますが、これって何なのでしょうか 4.syntax errorが出ているのに実行ができるのは何故なのでしょうか 5.この方面は素人同然なので文中の解釈が変かもしれませんが、ご指摘があればお願いします 自分でも調べてみましたがお手上げ状態です。助けていただければ幸いです

このQ&Aのポイント
  • ミオフォンを購入したが、スマート留守電の呼び出し時間を変更できない
  • アプリを削除して再インストールしても問題は解決しない
  • 製品のサポートはメーカーでも契約会社でも受け付けてくれない
回答を見る