1. ホーム
  2. c

[解決済み] "static const" vs "#define" vs "enum"

2022-03-15 22:35:49

質問

C言語の以下の文のうち、どれを使うのが良いか?

static const int var = 5;

または

#define var 5

または

enum { var = 5 };

解決方法は?

何のためにその値が必要なのかによります。 あなたは(そしてこれまでの皆さんも)3つ目の選択肢を省いています。

  1. static const int var = 5;
  2. #define var 5
  3. enum { var = 5 };

名前の選択に関する問題は無視するとして。

  • ポインタを渡す必要がある場合は、(1)を使用する必要があります。
  • (2)はオプションらしいので、ポインターの受け渡しは不要です。
  • (1)、(3)ともにデバッガのシンボルテーブルにシンボルが登録されており、デバッグが容易になる。 (2)はシンボルがない可能性が高く、これは何だろうという疑問が残ります。
  • (1)はグローバルスコープの配列の次元として使用できませんが、(2)と(3)はどちらも使用可能です。
  • (1)は関数スコープの静的配列の次元として使用できませんが、(2)と(3)は使用できます。
  • C99では、いずれもローカル配列に使用することができます。 技術的には、(1) を使用すると、VLA(可変長配列)を使用することになりますが、 'var' で参照される次元はもちろんサイズ 5 に固定されることになります。
  • (1)はswitch文のような場所では使えませんが、(2)と(3)はどちらも使用可能です。
  • (1)は静的変数の初期化に使用できませんが、(2)と(3)は使用可能です。
  • (2) は、プリプロセッサによって使用されるため、変更して欲しくなかったコードを変更してしまうことがあります。(1) と (3) の両方は、そのような予期せぬ副作用を持つことはないでしょう。
  • (2)がプリプロセッサーに設定されているかどうかを検出することができます。(1)も(3)もそれを可能にしません。

ですから、ほとんどの文脈で、代替案よりも「enum」を選ぶとよいでしょう。 そうでなければ、最初と最後の箇条書きが支配的な要因になる可能性が高く、一度に両方を満たす必要がある場合は、より難しく考えなければなりません。

もしC++について質問しているのであれば、(1)の静的constを毎回使うことになるでしょう。