C 言語では、以下のステートメントのうちどれを使用するのがよいでしょうか?
static const int var = 5;
または
#define var 5
または
enum { var = 5 };
ベストアンサー1
値が必要な目的によって異なります。あなた (およびこれまでの他の全員) は 3 番目の選択肢を省略しました。
static const int var = 5;
#define var 5
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) を使用します。