[解決済み] なぜコンパイラはこのような警告を出すのですか?"missing initializer" という警告が出るのはなぜですか?構造体は初期化されていないのでしょうか?
質問
あるプログラムのフロントエンドのようなものを作っています。プログラムを起動するために、次の呼び出しを使用しています。
CreateProcess()
へのポインタを受け取ります。
STARTUPINFO
構造体へのポインタを受け取ります。構造体を初期化するために、私は以前はこうしていました。
STARTUPINFO startupInfo = {0}; // Or even '\0'.
startupInfo.cb = sizeof(startupInfo);
GCCでプログラムをコンパイルするとき、これらの警告のセットを有効にします。
-Wall -Wextra
でコンパイルすると、最初の行を指しているイニシャライザがないという警告が出されます。
warning: missing initializer
warning: (near initialization for 'startupInfo.lpReserved')
ということで、結局は
STARTUPINFO startupInfo;
memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
そしてこの方法では、コンパイラは何の警告も出しません。 問題は、構造体を初期化するこれらの方法の違いは何なのか、ということです。 最初の方法を使うと、構造体は初期化されないのでしょうか? どちらがお勧めですか?
どのように解決するのですか?
しかし、GCCのメンテナがCのニュアンスについて私よりもずっと多くのことを知っていることは確かです。
GCC メーリングリストのこの問題についての小さなスレッドを参照してください。
- http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00031.html
- http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00059.html
- http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00128.html
肝心な点ですが、構造体を初期化する際に、単に
{0}
だけで構造体を初期化すると、実際には全体がゼロ初期化されます。
C99規格では、6.7.8/21 "初期化 - Sematics"で次のように書かれています。
中括弧で囲まれたリスト内の初期化子が集合体の要素やメンバよりも少ない場合、または、既知のサイズの配列を初期化するために使用される文字列リテラルの文字数が配列内の要素よりも少ない場合、集合体の残りは、静的記憶期間を持つオブジェクトと同様に暗黙的に初期化されなければならない。
C90 は 6.5.7 で少し異なる表現で本質的に同じことを言っています (言い換えれば、C99 はここに新しいものを追加していません)。
また、C++では、これは中括弧の空のセット、".C++、".C++に拡張されたことに注意してください。
{}
というのは、(テンプレートのように)型のメンバやメンバ数が分からない場合があるからです。 そのため、オブジェクトが持つ可能性のあるメンバーの数よりも短いイニシャライザー リストを持つことは、良い習慣であるだけでなく、時には必要なことでもあるのです。
関連
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] ⑭と⑯は何のためにあるのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?
-
[解決済み] なぜ16進数には0xがつくのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
関数 'malloc' の暗黙の宣言に対する解決策
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] なぜ16進数には0xがつくのですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] ストラクチャーとユニオンの違い