SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

たった5つのルールではじめるC言語開発

便利な記述法


#defineで「またの名を・・」

 #define(デファイン)は、数値などに別の名前を付けるためのものです。使い方は、以下のとおりです。

#defineの使い方
#define  新しい名前    元の値

 たとえば、LEDを消灯する関数はこうでした。

リスト3:直接数値で書いたプログラム
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です。

リスト4:#defineで数値に別の名前をつけて使う
#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に示します。

リスト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をうまく使うと、ハードウェアの変更に強いプログラムにしたり、読む人にわかりやすいプログラムにすることができるのです。

次のページ
ヘッダーファイルと#include

この記事は参考になりましたか?

たった5つのルールではじめるC言語開発連載記事一覧

もっと読む

この記事の著者

舘 伸幸(タチ ノブユキ)

NECマイクロシステム株式会社 勤務NPO法人SESSAME 所属開発ツールのソフトウェア開発を経て組込みソフトウェア開発に従事。プライベートにも半田ごては手放さない。2006年からSESSAME に参加。若い世代に物を作る楽しさを伝えていきたい。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3731 2009/03/26 17:09

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー