C言語入門(21)定数constとdefineの違い

Posted: 2013年01月03日

定数宣言は、constまたはdefineを用いることで
可能です。

 const int cnMax = 50;
 #define CN_MAX (50)

宣言方法が異なりますがどちらも定数を宣言可能です。

では、なにが違うのか!!

constは、変数宣言で使用可能です。
定数変数の宣言が可能になります。

defineは、定数に別名を割り当てることができます。
defineで設定したものは変数ではなく数字に「CN_MAX」を割り当てただけになります。
defineは特殊で実際にコンパイルされるときには、defineの値は、割り当てた値に変換されています。
実行時には、定数として扱われることになります。

それは、コンパイル前のプリプロセッサでCN_MAXを50に置換する処理が実行されるためです。
つまり、defineはテキストエディタの置換機能のような処理を行なってくれます。
なのでdefineには、何でも記述することが可能であり
便利で且つ、わかりやすくしてくれます。

 #define MAX(a,b) ( ((a)>(b) ) ? (a) : (b) )

最大値を計算してくれるmax関数はdefineでも定義できます。
正確には、max関数ではなく、defineされたmax関数が用意されています。
関数かと思っていたものが実はdefineで定義されていることがよく有ります。

では、なぜ関数ではなくdefineで定義されているのでしょうか
それは、関数にすると関数呼び出し処理に時間がかかりますが
defineは、関数ではないためその時間を省略することができます。
高速化のためにdefineを行うことがあります。
これを「インライン化」という事もあります。

defineの使いかた

定数定義

 #define INT_MAX (2147483647)
 #define WEEK_NAME_LIST ({"月", "火", "水", "木", "金", "土", "日"})

関数定義

 #define LOG_OUT(str) (printf(“%s”, (str)))

注意点

  • defineで定義するときには;を付けない
  • 引数を使用する際には、()をつける。

例) (str)

  • defineに対応する値にも()をつける

例) (2147483647)

  • 意味がわかる名称にする(実際の値の名称にしない)

例) 正 #define CARD_MAX (13 * 4)
  誤 #define CARD_FOUR_SUITE_13 (13 * 4)

練習練習:

  1. いままで実装してきたコード内で数字が存在する場合defineで定数化できないか検討する
  2. いままで実装してきた小さな関数がdefineで置き換えられないか考えてみてください
カテゴリー: プログラム, 入門 | タグ: , | コメント無し »

コメント