[解決済み】"static const" vs "#define" vs "enum"
2022-03-23 19:21:07
質問
C言語の以下の文のうち、どれを使うのが良いか?
static const int var = 5;
または
#define var 5
または
enum { var = 5 };
解決方法は?
何のためにその値が必要なのかによります。 あなたは(そしてこれまでの皆さんも)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)の静的constを毎回使うことになるでしょう。
関連
-
[解決済み] std::string を const char* または char* に変換する方法
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] Static readonly」対「const」。
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] スタティック・ライブラリとシェアード・ライブラリの違い?
-
[解決済み】静的定数文字列(クラスメンバ)
-
[解決済み】static constと#defineの比較
-
[解決済み】PHP|define() vs. const.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】警告:引数「互換性のないポインタ型から」を渡す[デフォルトで有効]。
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?