#defineで「またの名を・・」
#define(デファイン)は、数値などに別の名前を付けるためのものです。使い方は、以下のとおりです。
#define 新しい名前 元の値
たとえば、LEDを消灯する関数はこうでした。
void AllLedOff( )
{
P12.3 = 0 ;
P4.5 = 0 ;
P13.0 = 0 ;
P2.3 = 0 ;
P2.2 = 0;
return;
}
もし回路が変更になって、LEDは1で消灯、0で点灯という仕様に変わったらどうでしょう。実際の開発でもそのようなことは日常茶飯で、事実マジカルボックスでも試作版と市販版ではLEDの点灯論理は変更になっています。
こんなとき、リスト3のようにそれぞれ値を書いておくと、それらすべてを書き換えることになります。まだこのように一カ所に集まっていればよいですが、これがプログラムの各所にちらばっていると、どうしても見落としや変更漏れが発生してしまいます。そこで、通常はプログラム中には値を直接記述せず、#defineで別の名前に定義しなおして使う方法をとります。そのようにして記述しなおした例がリスト4です。
#define LED_OFF 0
void AllLedOff( )
{
P12.3 = LED_OFF;
P4.5 = LED_OFF ;
P13.0 = LED_OFF ;
P2.3 = LED_OFF ;
P2.2 = LED_OFF;
return;
}
さらに#defineは、数値だけではなく変数名も別名に置き換えることができます。いまたとえばLEDのD7はP123に接続されていますが、これもいつか変更になるかもしれません。変更にならなくても、プログラムを見て何をしているのかわかりにくいという問題もあります。たとえばP13.0 = LED_OFF;って、一体どのLEDのことかぱっとわかりますか?ハードウェア仕様を調べるか暗記していないとわかりませんね。こんな問題も、#defineを使ってわかりやすい名前に定義しておくことで解決することができたりします。リスト4に加えて、さらにLEDの接続ポート名も別の名前で定義した例をリスト5に示します。
#define LED_OFF 0
#define LED_D7 P12.3
#define LED_D6 P4.5
#define LED_D5 P13.0
#define LED_D4 P2.3
#define LED_D3 P2.2
void AllLedOff( )
{
LED_D7 = LED_OFF;
LED_D6 = LED_OFF ;
LED_D5 = LED_OFF ;
LED_D4 = LED_OFF ;
LED_D3 = LED_OFF;
return;
}
どうでしょうか。
P12.3 = 0;というのは、プログラムを作ったひと以外、なにをしているのか意味不明な記述です。一方LED_D7 = LED_OFF;と書いてあれば、はじめてこのプログラムを見たひとでも「ああ、D7のLEDを消灯するんだな」とわかります。
こんなふうに、#defineをうまく使うと、ハードウェアの変更に強いプログラムにしたり、読む人にわかりやすいプログラムにすることができるのです。
