「static const」と「#define」と「enum」の違い 質問する

「static const」と「#define」と「enum」の違い 質問する

C 言語では、以下のステートメントのうちどれを使用するのがよいでしょうか?

static const int var = 5;

または

#define var 5

または

enum { var = 5 };

ベストアンサー1

値が必要な目的によって異なります。あなた (およびこれまでの他の全員) は 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) (static const) を使用します。

おすすめ記事