6

すべての構造体メンバーを 0 に初期化したい。一般的な解決策は、次のようにすることです。

struct foo bar = {0}

この例を作成します:

#include <stdio.h>

struct Stru2 {
    int c;
    int d;
};

struct Stru1 {
    int a;
    Stru2 b;
};

int main()
{
    struct Stru1 aaa = { 0 };
    return aaa.b.c;
}

そして、ANSIがこれをどのように処理するかを確認するために、このパラメーターを使用してコンパイル(gcc 4.6.3)します

gcc -Wall -Wextra -pedantic -ansi main.cpp

そして、次の警告が表示されました。

main.cpp: In function ‘int main()’: 
main.cpp:36:28: warning: missing initializer for member ‘Stru1::b’ [-Wmissing-field-initializers]

問題は、なぜ-Wextraがこの警告を生成するのかということです。常に "= {0}" とは限りません。すべてのメンバーを 0 に設定しますか?

4

3 に答える 3

12

それは単なる乳母の警告です..= {0}間違いなくすべてのメンバーをゼロに設定します。警告として含まれている理由は、構造体にフィールドを追加する可能性があり、それが正しく初期化されることを確認したい場合のためです。警告があると、それらの場所をすばやく見つけて修正できます。たとえば、次のようなイニシャライザを修正するとします。

struct Stru1 aaa = { 1, { 2, 3 } };

int e次に、フィールドをに追加しますStru2

struct Stru2 {
    int c;
    int d;
    int e;
};

そして、初期化することが非常に重要であるとしeましょう。そうですね、 がなけれ-Wmissing-field-initializersば、気になるすべての場所を見つけるためにコードを探し回る必要があります。警告が表示されると、先ほど見たような診断メッセージが表示され、非常に簡単に見つけて修正できます。

struct Stru1 aaa = { 1, { 2, 3, 4 } };

ただし、この警告を利用するには、すべての構造を調べて完全に初期化する必要があります。あなたの場合、それは次のようなことを意味します:

struct Stru1 aaa = { 0, { 0, 0 } };
于 2012-11-05T19:08:00.983 に答える
5

はい、{0}はすべての構造体メンバーを0に設定します。これは、最初のメンバーを0に設定し、少なくとも1つのメンバーが初期化されている限り、他のすべてのメンバーはデフォルトで0に設定されるためです。初期化されていない構造体メンバーは常にゼロに設定されていますか?を参照してください。。

于 2012-11-05T19:11:53.477 に答える
3

これはGCC バグ #53119 に関連しています。バグ スレッドにフォローアップを投稿すると、おそらく問題の解決に役立つでしょう。

于 2012-11-05T21:33:53.523 に答える