C言語のconstと#defineの違いを徹底比較!初心者でもわかる使い分けガイド
生徒
「C言語で定数を作るとき、constと#defineってどっちを使うべきなんですか?」
先生
「どちらも値を変えられない定数を作る方法ですが、仕組みや使い方が大きく違います。状況によって使い分けることでプログラムが正しく動きやすくなります。」
生徒
「違いがよく分からなくて、なんとなく#defineばかり使っていました。」
先生
「初心者のうちは同じに見えますが、コンパイルの仕組みやメモリの扱いが異なるので、学習する価値があります。それでは詳しく見ていきましょう。」
1. constと#defineはどちらも定数を作れる
C言語には、値を後から変更できない定数を作る方法が複数あります。その代表がconstと#defineです。どちらも「変更されない値」を扱えますが、内部での動きが違います。プログラムの安全性や読みやすさを考えると、目的に合わせた選び方が重要です。
constは変数と同じ感覚で扱え、型を持った定数として宣言できます。一方、#defineはプリプロセッサという仕組みで名前を値に置き換えるだけのルールになっています。この違いが、使い方の差につながります。
2. constの基本と書き方
constは「変更できない変数」を作るための仕組みです。型を指定して宣言するため、間違った使い方をするとエラーが出てくれます。
const int TAX = 10;
printf("%d\n", TAX);
この書き方なら、TAXに別の値を代入しようとするとエラーになります。数値だけでなく、小数、文字、文字列など様々な型に使えます。コンパイル時に型チェックが働くので、初心者でも安全に扱えます。
3. #defineの基本と書き方
#defineはプリプロセッサという仕組みで、プログラム内の文字をそのまま置き換える命令です。変数とは違い、型を持ちません。
#define TAX 10
printf("%d\n", TAX);
プログラムがコンパイルされる前の段階でTAXが「10」に置き換えられます。型が無いため柔軟ですが、間違った使い方でも気づきにくいという欠点があります。
4. constと#defineの決定的な違い
同じように見えて、仕組みは大きく異なります。次のポイントが理解のカギです。
- constは型を持つが、defineは型を持たない
- constは変数としてメモリに存在するが、defineは文字置換で存在しない
- エラーの検出はconstの方が有利
#define t 10/2
const int c = 10/2;
printf("%d\n", t);
printf("%d\n", c);
この例ではどちらも同じ結果に見えますが、defineはただの文字置換なので計算式をそのまま書いたのと同じ扱いになります。型のないまま置き換えられるため、思いがけない動きをすることもあります。
5. defineは命令として置き換えもできる
defineは数字だけでなく文字列や式を丸ごと置き換えることもできます。定数だけでなく、短い処理を定義して使う場面もあります。
#define HELLO printf("こんにちは!\n")
HELLO;
このように、関数のように見えても実際には文字の置換なので注意が必要です。ミスをしてもエラーにならず、そのまま置き換えられてしまうこともあります。
6. constは変数と同じように扱える
constは型を持つため、配列や構造体と組み合わせて使う場面でも便利です。たとえば文字列を変更されたくないときにも使えます。
const char msg[] = "ようこそ!";
printf("%s\n", msg);
この書き方なら、誤って書き換えようとした場合にエラーになります。「絶対に変更されたくないデータ」を保護しやすいのがconstの強みです。
7. 実際にはどちらを使うべき?
結論として、初心者はconstを使う方が安全で扱いやすいと言えます。型が明確なため、コンパイラが間違いを見つけてくれるからです。
一方、#defineは柔軟で便利ですが、使い方を間違えると予想外の動作が起きる場合があります。プログラムが複雑になるほど、constの方が読みやすく管理しやすい場面が増えます。
8. 例で見比べてみよう
まずはdefineだけで書いた例です。
#define DISCOUNT 2
int price = 100 / DISCOUNT;
printf("%d\n", price);
次にconstで同じ処理を書いた例です。
const int DISCOUNT = 2;
int price = 100 / DISCOUNT;
printf("%d\n", price);
動きは同じですが、constは型があるため安心して扱えます。型の間違いもコンパイラが教えてくれるため、初心者には大きな助けになります。
9. 実行結果の例
50
どちらでも同じ結果になりますが、保守性や安全性を考えるとconstが選ばれる場面が多くなります。
10. 型チェックがあるかないかが大事
変数に似た仕組みを使いたいならconst、シンプルに置き換えたいだけなら#defineが向いています。プログラムが大きくなるほど、型のチェックがあるconstの方が安心です。
最近のC言語入門書やプログラミング教育でも、定数はconstを使う方が主流になっています。トラブルを避けるうえでも、基本はconst、特殊な場合だけdefineと覚えると理解しやすくなります。