C言語教室 第31回 インクルードって何?
前回はソースファイルを分割する際の宣言について説明しましたが、今回はいつも最初にオマジナイのように書くインクルードについて説明します。
平均を求めるave関数を”ave.c”と別のファイルにして、これを使う時には、そこに含まれる関数の名前とグローバル変数のextern宣言をしてから使うことを説明しました。
extern void ave();
extern int a;
extern int b;
void main() {
a = 2;
b = 9;
ave();
}
平均を求めるなんて、いろいろなところで使うような関数ですから、これを使うたびに間違いなく同じ宣言を書くのは面倒くさいだけではなく、ここを忘れたり間違ったりすることでエラーとなるので、定型文を用意してそれを使いたくなります。
そこで ave.c を使う時に必要な宣言だけをインクルードファイルとして別に用意することにします。
[ave.h]
extern void ave();
extern int a;
extern int b;
[main.c]
#include “ave.h”
void main() {
a = 2;
b = 9;
ave();
}
これで ave関数を使いたい時には”ave.h”をインクルードすれば良いということになります。インクルード命令は”#”で始まっているので、これはプリプロセッサの命令です。プリプロセッサというのは、
C言語教室 第11回 - プリプロセッサとマクロ
でも説明しましたが、コンパイルに先立ち文字列的な処理を行うもので、#include というのは、その行を指定されたファイルの内容に「置き換える」ことを指示します。ですからプリプロセッサが#includeを展開すると、先のmain.cは
extern void ave();
extern int a;
extern int b;
void main() {
a = 2;
b = 9;
ave();
}
という中身になり、これがコンパイルされます。言ってみればひとつずつコピペする作業を自動的にやってくれる訳です。
いつものオマジナイである #include <stdio.h> というのも、実はこのインクルードファイルにprintfが関数なんだよという定義が含まれていて、これをインクルードすることでprintfが定義されてちゃんと呼び出せるようになるという仕組みです。
ここで気がつく人は気がついたかもしれませんが、ave.hをインクルードするときは、ファイル名をダブルクオート(”)で囲みましたが、stdio.hはブラケット(<>)で囲んでいます。これは読み込むインクルードファイルがどのディレクトリにあるかを示すもので、自分の書いたソースコードと同じディレクトリにあるファイルを読む時にはダブルクオートを使い、システムが持っている関数のインクルードファイルは別のシステムが決めたディレクトリにあるのでブラケットで囲むという使い分けをしています。
なお、インクルードファイルは一般的に末尾を”.h”とし、ヘッダファイルと呼ぶこともあります。
今回も課題はありません。次回はインクルードファイルを書く時に気をつけるところと、プロトタイプ宣言を取り上げます。
ヘッダ画像は いらすとや さんより
https://www.irasutoya.com/2017/10/blog-post_58.html
この記事が気に入ったらサポートをしてみませんか?