【C言語】const と #define の違いとは?定数とマクロの考え方
今回の記事でわかること
- const を使った定数の定義方法が分かる
- #define を使ったマクロの基本と注意点が分かる
- 定数とマクロをどう使い分けるべきか判断できるようになる
定数とは
プログラムの中で 値が変わらないことを保証したいもの を定数と呼びます
数学でいう円周率 π のように、計算の途中で変わってほしくない値を扱うための仕組みです
C言語では const キーワードを使って定数を定義します
#include <stdio.h>
int main(void) {
const double PI = 3.14;
printf("円周率は %f です\n", PI);
return 0;
}一度代入した値は変更できないため、うっかり書き換えてしまうミスを防ぐ 効果があります
定数を使うメリット
const を使うと、コードに次のような良い影響があります
- 値が変わらないことをコード上で明示できる
- 数字の意味が分かりやすくなり、可読性が上がる
- 代入ミスによるバグを未然に防げる
- 型があるため、コンパイラがエラーを検出しやすい
例えば
const int MAX_SCORE = 60;と書いておくと「この 60 は合格点なんだな」と一目で分かります
マクロとは
C言語には マクロ という仕組みもあります
マクロは、コンパイル前にコードを文字通り置き換える機能です
#define を使って定義します
#define PI 3.14
#define CIRCLE_AREA(r) (PI * (r) * (r))これは関数ではなく、書かれた内容がそのまま展開される のが特徴です
#include <stdio.h>
#define PI 3.14
#define CIRCLE_AREA(r) (PI * (r) * (r))
int main(void) {
double radius = 5;
printf("半径 %.1f の円の面積は %f\n", radius, CIRCLE_AREA(radius));
return 0;
}マクロを使うメリットと注意点
マクロには便利な点もありますが、注意も必要です
メリット
- 定数だけでなく計算式も定義できる
- コンパイル時に展開されるため、関数呼び出しのオーバーヘッドがない
- 古い C コードとの互換性が高い
注意点
- 型チェックが行われない
- デバッグ時に中身が見えにくい
- 書き方を間違えると意図しない計算になる
そのため、
マクロはシンプルな用途に限定して使う のが安全です
定数とマクロの違い
| 項目 | const 定数 | #define マクロ |
|---|---|---|
| 値の変更 | 不可 | 不可(置換後) |
| 型 | あり | なし |
| 型チェック | される | されない |
| デバッグ | しやすい | しにくい |
| 主な用途 | 定数値の管理 | 簡単な置換や条件分岐 |
どちらを使うべきか
基本的な考え方はとてもシンプルです
- 値を表したいだけなら const を使う
- 条件付きコンパイルや単純な置換が必要ならマクロを使う
最近のC言語では、安全性と可読性の面から const を使うのが主流 です
マクロは
- ヘッダファイルでの定数定義
- 環境依存の切り替え
- 非常に単純な処理
といった限定的な場面で使われることが多くなっています
まとめ
定数とマクロはどちらも
「値を固定する」という目的は同じですが、仕組みはまったく異なります
- const は 型があり安全な定数
- #define は 文字置換によるマクロ
まずは const を正しく使えるようになることが大切です
そのうえで、必要な場面だけマクロを使うようにすると、読みやすく安全なC言語プログラムが書けるようになります