[前へ]   [目次へ]   [次へ]

#includeの意味(C/C++)

今回は、疑似乱数の生成・・・の前に、 #include について解説します。

とりあえず、以下のソースをビルドしてみてください。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
#include <stdio.h>

int main(void)
{
   
int n;
   n=rand();
//疑似乱数を取得
   
printf("%d",n);
   
return 0;
rand は定義されていないとかいうエラーが出るはずです。
(コンパイラによってはエラーにならないこともあるかもしれませんが、大体は出るはず・・・)
しかし、 rand 関数はちゃんと規格で定義されている標準関数です。
なのに、定義されていないというのも一見変な話です。

今まで、とりあえず
#include <stdio.h>
という行をプログラムの先頭に書いていました。

以前にも少し触れましたが、 #include はファイルの埋め込み命令なのです。
試しに、この行も削除して(↓のソース)ビルドしてみてください。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
int main(void)
{
   
int n;
   n=rand();
//疑似乱数を取得
   
printf("%d",n);
   
return 0;
今度はさっきのエラーに加えて、 printf まで定義されていないとか言われるはずです。
実は、C言語は初期状態で全く関数が定義されていないのです。
これは標準関数も例外ではなく、わざわざ定義を後付けしなければならないのです。

全ての標準関数を一々全部定義しなおすのも面倒ですし、間違えるといけないので、
あらかじめ決められた名前のファイルに定義されていることになっています。

そして、 #include は任意のファイルを書かれた場所に展開する機能を持ちます。
標準で決められたファイルを先頭に展開することによって、標準関数を定義するという訳です。

各関数は種類などによって、いくつかのファイルに分割されて定義されています。
printf 関数は stdio.h ファイルに、 rand 関数は stdlib.h ファイルに定義されていることになっています。
今まで、
#include <stdio.h>
ととりあえず書いていたのは、これがないと入出力系の関数が使えないためです。
printf も fputs も fgets も sscanf も getchar も、みんな stdio.h ファイルに定義されてるのです)
つまり、これを展開しておかないとキーボードから文字を入力したり、画面に文字を出力したりできないんですね。
それでは何が起こっているのかさっぱり分からないというわけで、とりあえず書いていたという訳です。


さて、 #include がファイル展開なら、読み込んでいるファイルが存在しているはずです。
大抵はコンパイラの構成ファイルの中に stdio.h やら stdlib.h やら他にもいっぱい入っているフォルダがあるはずです。
.h の拡張子のファイルはソースなので中を開いて読むことができます。
でもこの中に書いてあることは大抵難しいので、今読んでみてもさ〜っぱり分からないでしょう(笑)
とりあえず、ファイルが存在しているということだけ、覚えておいてください。
(これらのファイルは標準関数を使うために必要なので、削除はもちろん、編集もしちゃダメです)


#include を始めとして、先頭に # が付いている命令は、「プリプロセス命令」と呼び、
規格上は行頭に # を置かなければいけないことになっているはずですが、
スペースやタブを混ぜても問題なく扱ってくれるコンパイラもあります。

プリプロセス命令は実際にコンパイルを開始するよりも先行して処理されます。
プリプロセス命令の処理中にソースファイルを変更したりできますが、( #define 等で可能です)
コンパイルエラーなどが発生した時には変更後の状態でエラーが報告されますので、
変にプリプロセス命令を多用してぐちゃぐちゃにすると、ややこしいエラーメッセージになることがあるので注意です。


さて、 #include の構文は二種類で、一つは
#include <stdio.h>
のように、ファイル名(stdio.h)を <> で囲うもので、
これは基本的に標準のヘッダファイル(後述)を読み込むために使用します。
この書式は通常コンパイラ付属のヘッダファイルが入ったフォルダから指定したファイルを読み出します。

もう一つは
#include "filename.h"
のように、ファイル名(filename.h)を "" で囲うものです。
これは基本的に自作のヘッダファイルを読み込むために使用します。
この書式は通常、コンパイル中のソースファイルのあるフォルダから指定したファイルを読み出します。

ヘッダファイル(拡張子 .h または .hpp )は、一般的に宣言のみを書いたファイルで、
複数のソースファイルから共通して使用する関数などを宣言するファイルです。
C/C++ではヘッダファイル自体をコンパイルすることは通常無く、
ソースファイルから #include を使用してソース中に埋め込んで使用します。

コンパイラによっては、書式によって指定されたフォルダに指定されたファイルが無い場合、
もう一つの書式で書かれているように再試行する場合がありますが、
コンパイラによっては行ってくれないので、書式は正しく選択した方が無難です。
ファイルが見つからないと、「ファイルが見つからない」旨のエラーが出ます。

単一のソースファイルでプログラムを作っているうちは、ヘッダファイルを自分で作ることはあまりありません。
しかし、ソースファイルが複数になると、ヘッダファイルを作らないと宣言の統一性の維持が難しくなるので
ヘッダファイルもたくさん作ることになります。

次回は、疑似乱数の生成を行う rand 関数についての予定です。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2008/10/16