こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の#includeについて

ただいまC言語の勉強を始めたばかりなのですが、
疑問に思った点があったので質問させていただきます。参考書やweb上で#includeについて調べると、
<stdio.h>なら、<stdio.h>に書かれている内容を含める、<stdio.h>にはC言語を使う上で標準的に使われるものが色々書かれている、例えば、printfを使うための色々な設定であるということで一度は理解できたのですが、「外したらどうなるのだろう」と思い、
外してみたところ、先ほどの状態となんら変わりなく
動作しました。ここで自分がやったプログラムは
初歩的な文字列表示(printf),変数を使った計算(int)です。この場合が別に#includeを最初に記述しなくても良かったパターンだと思うのですが、
では一体どういった時に記述しないと動作しなくなるといった現象が起こるのでしょうか?
また、記述しなくてもいい場合はどういった時なのでしょうか?私のレベルは本当に始めたばかりの初心者です。どうぞご教授お願いいたします。

投稿日時 - 2005-05-15 20:49:31

QNo.1389592

困ってます

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

コンパイラの種類によって、エラーになる。
警告がでるのです。
stdio,hの実態はリンクで結合されるため、
エラーにならなかった場合、正常動作に
なります。
言い換えれば、一般的なコーディング規約の通り
#includeを記入しておけば、コンパイラの種類に
関わらず、エラーにならないということです。

#include文を記入し忘れることは仕方ないとして
も、必ず記入するようにしてください。

参考URL:http://kamei-www.cs.titech.ac.jp/~mmasato/c_lang.htm

投稿日時 - 2005-05-15 21:28:08

お礼

ご回答ありがとうございます。参考URL、とても参考になりました。本当に#includeというものの存在が重要だということが分かりました。本当に貴重なお時間をありがとうございました。感謝します。

投稿日時 - 2005-05-16 20:34:08

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

ヘッダでは、主に型やマクロの定義、それから関数のプロトタイプが記述されています。

例えば、fopenなどでFILE型を使いたい場合は、<stdio.h>をインクルードしていなければ、FILE型が定義されていない旨のコンパイルエラーになってしまいます。

printfのような可変個引数をとる関数の場合、プロトタイプなしで呼び出した場合の動作は未定義です。具体的には、関数への内部的な引数の渡し方がプロトタイプの有る無しで変わってしまったりするからです。

ヘッダなしで関数が誤動作することを体感したいのであれば、<math.h>なしでfabsやsqrtの結果を調べてみるのが一番です。

投稿日時 - 2005-05-16 08:21:52

お礼

まだ始めたばかりで関数についてはあまりよく分からなかったのですが、プロトタイプというものの存在が気になって、参考書を飛ばして勉強してみました。一つの質問で二つの収穫があったのでまだまだ分からないことばかりですが嬉しいです。貴重な時間どうもありがとうございました。

投稿日時 - 2005-05-16 20:54:40

ANo.3

基本的にライブラリで用意された関数を使用する場合、その関数が宣言されているヘッダファイルをincludeする必要があります。

あと、
そもそも、ヘッダファイルの存在意義は何か、や、
#include <…….h>
#include "…….h"
の違いを調べてみたり、ヘッダファイルの中身を見て勉強してはいかがでしょうか?なかなか面白いですよ。

投稿日時 - 2005-05-15 22:06:45

お礼

ご回答ありがとうございます。頑張って勉強して、色々な違いを試して見たいと思います!!本当に貴重な時間をありがとうございます。

投稿日時 - 2005-05-16 20:36:30

ANo.1

bcc32とlcc、gccで
試してみました。
gccとbcc32では、
#include <stdio.h>
なしでも実行できましたが、
lccでは、実行はできましたが、正常な動作ではありませんでした。

基本的に、標準ライブラリ関数を使う場合、その関数の定義(宣言)のされているヘッダファイル(*.h)をインクルードする必要があります。

記述しなくても実行できたのは、基本的にリンクされるライブラリに含まれていたので、うまく動作したのではないかと思われますが、本来記述しなければなりません。
記述するようにしましょう

投稿日時 - 2005-05-15 21:22:45

お礼

ご回答ありがとうございます。初心者なもので最初は理解できませんでしたが、今色々調べてご回答いただいた方の説明が理解できました。なるほど、と思いました。インクルードというものの意味についての理解がかなり高まりました。貴重な時間を割いていただき、本当にありがとうございました。

投稿日時 - 2005-05-16 20:27:28

あなたにオススメの質問