ヘッダーファイルと#include
C言語のプログラムは、これまで例題ではxxxx.cというファイルに記述しました。これが本格的なプログラムになると、.cファイルだけでなく.hという拡張子のファイルとペアの構成でプログラムを作ります。このとき、.hのファイルを「ヘッダーファイル」といいます。
.cファイルにはプログラム本体を記述します。では.hには何を記述するのでしょうか。それは、.cの中に記述された関数や#defineによる別名定義のうち、他の.cファイルからも使いたいものを.hに記述して公開します。
たとえばリスト1の例に出てきたLed_D7()という関数がmain.cでなく別のled.cというファイルの中にあるとします、これをmain.cファイルの中の関数から呼びたいとき、なにが必要でしょうか。それはLed_D7()関数のプロトタイプと、引数に与えるパラメータの情報です。そこでこれらをヘッダーファイルに記述して、呼ぶ側と呼ばれる側で情報を共有させます。
つまり、led.hの中には以下のように書いておき、
void Led_D7( int onoff ); #define TENTOU 1 #define SHOUTOU 0
led.cには、以下のように書きます。
void Led_D7( int onoff )
{
if ( onoff == TENTOU ){
P12.3 = 1;
}
else{
P12.3 = 0;
}
return;
}
そして、このヘッダファイルの情報を持ちたいとき、#include(インクルード)という文をつかって、そのヘッダファイルを指定します。
#include "led.h"
void main()
{
Led_D7( TENTOU );
}
当のled.cもled.hの情報は必要ですから、以下のように記述します。
#include "led.h"
void Led_D7( int onoff )
{
if ( onoff == LED_ON ){
P12.3 = 1;
}
else{
P12.3 = 0;
}
return;
}
もちろんヘッダーファイルの情報をそれぞれ.cの中に書いても文法上は間違いではありません。しかし、同じ内容を複数箇所に記述すると、間違えたり変更時に変更もれをしたりします。そこで、このヘッダーファイルと#includeのしくみを利用して、記述を1カ所にしてそれを共有するという方法を使います。
スプーン音待ちのテストプログラムであるmain.cの上の方を探してみると、こんな記述が見つかります。
************************************* ** Include files ************************************* */ #include "macrodriver.h" #include "system.h" #include "port.h" #include "watchdogtimer.h"
それぞれ見覚えのある名前ではないでしょうか。そう、macrodriver以外は、Appliletで設定した機能の名前です。設定した内容はそれぞれ設定動作をするプログラム*.cが自動生成され、それらの情報を使えるように.hファイルで公開しているわけです。main.cではそれら設定情報を#includeで共有しているゆえに、いきなりなんの宣言もなくポート名(P12.3とか)が使えたりしているということなのです。
どうでしょう、ちょっとわかったようでわからない? かもしれません。次回以降で、マジカルボックスの実際のプログラムを見ながら解説をします。そこで実例というか実際の使われ方を見ていただくのが一番わかりやすいと思います。
長い間お疲れさまでした。以上でマジカルボックスで使用しているC言語の文法はすべてです。次回からはこれまで学んだ知識をもとに、実際のプログラムを読み解いていきます。例題でしか見てこなかった各種命令も、実際にはこんなふうに使うんだというのを見ることで、より理解を深めることができます。文法の教科書を読むよりも、たくさん小説などを読むほうが実力がつくのと同様です。
