[解決済み] "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つ目の選択肢を省いています。
-
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 実装 サイバーパンク風ボタン
おすすめ
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] char *とchar[]の違い [重複]
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] .aファイル、.soファイルとは何ですか?
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?