web-dev-qa-db-ja.com

構造体の配列をすべて0に初期化する最も速い方法は?

以下の構文を使用して、構造体の配列をすべて0に初期化しようとしています。

STRUCTA array[MAX] = {0};

ただし、gccから次の警告が表示されます。

警告:初期化子の周りに中括弧がありません

私は何が間違っていますか?これを行う別の/より良い方法はありますか?

25
TCSGrad

構造体の最初のメンバーがスカラー型を持っている場合は、

STRUCTA array[MAX] = {{ 0 }};

構造体の最初のメンバーが偶然別の構造体オブジェクトであり、その最初のメンバーがスカラー型である場合は、次を使用する必要があります

STRUCTA array[MAX] = {{{ 0 }}};

等々。基本的に、ネストされた別の集約(構造体または配列)を「入力」するたびに、ネストされた{}の新しいレベルを開く必要があります。したがって、この場合、ネストされた各集約のfirstメンバーも集約である限り、{}でさらに深く進む必要があります。

これらの余分なブレースはすべて、警告を回避するためにのみ存在します。もちろん、これは無害な警告です(この特定の場合)。シンプルな{ 0 }を使用できます。

おそらくこれに対処する最善の方法は、この警告を完全に無効にすることです(正しいコマンドラインオプションについては、@ pmgの回答を参照してください)。 GCCに取り組んでいる誰かが明確に考えていませんでした。つまり、私はその警告の価値を理解しています(実際には非常に役立つ可能性があります)が、{ 0 }の機能を壊すことは受け入れられません。 { 0 }には特別な扱いが必要です。

29
AnT

gccは迷惑です。警告なしでそれを受け入れる必要があります。
これを試して

STRUCTA array[MAX] = {{0}};

そのgccの動作は、オプション-Wmissing-bracesまたは-Wno-missing-bracesで制御できます。

-Wallはこの警告を有効にします。 -Wallを使用して、中かっこがない場合は、-Wall -Wno-missing-bracesを使用します

8
pmg

これは単にgccによって発行された有害な警告であり、-Wno-bracesを使用して無効にします。 {0}は、コードで認識されていないタイプの定義に非常に役立つ「ユニバーサルゼロ初期化子」であり、gccがその使用を推奨しないことは、優れたコードの追求に積極的に有害です。

Gccがこの警告を保持したい場合は、少なくとも特殊なケース{0}を使用し、この1つのケースでは警告を無効にする必要があります。

配列は中括弧で初期化されますが、構造体も初期化されます。おそらく、0の周りに追加のブレースのセットを配置する必要があり、STRUCTAの定義方法によっては、いくつかの追加の0をコンマで区切ってください。

1
nmichaels

それはSTRUCTAに依存します。例えば ​​:

typedef struct structa 
{
    int a, b;
} STRUCTA;

int main (int argc, char const* argv[])
{
    STRUCTA array[10] = {{0,0}};
    return 0;
}
1

完全に空のブレースを使用することで警告を回避できます。

STRUCTA配列[10] = {};

配列は aggregate-initialized になります。つまり、配列内の各構造体は value-initialized になります。空の括弧で値を初期化すると、各構造体の aggregate-initializion に変わり、すべてのフィールドが0に設定されます。

これは、構造体がPODである限り、すべてのケースで機能します(正確な説明については、上記のリンクを参照してください)。

1
Pablo Alvarez

STRUCTAを0に割り当てることはできますか?

常にmemset()も使用できます。

0
tamarintech