以下の構文を使用して、構造体の配列をすべて0に初期化しようとしています。
STRUCTA array[MAX] = {0};
ただし、gccから次の警告が表示されます。
警告:初期化子の周りに中括弧がありません
私は何が間違っていますか?これを行う別の/より良い方法はありますか?
構造体の最初のメンバーがスカラー型を持っている場合は、
STRUCTA array[MAX] = {{ 0 }};
構造体の最初のメンバーが偶然別の構造体オブジェクトであり、その最初のメンバーがスカラー型である場合は、次を使用する必要があります
STRUCTA array[MAX] = {{{ 0 }}};
等々。基本的に、ネストされた別の集約(構造体または配列)を「入力」するたびに、ネストされた{}
の新しいレベルを開く必要があります。したがって、この場合、ネストされた各集約のfirstメンバーも集約である限り、{}
でさらに深く進む必要があります。
これらの余分なブレースはすべて、警告を回避するためにのみ存在します。もちろん、これは無害な警告です(この特定の場合)。シンプルな{ 0 }
を使用できます。
おそらくこれに対処する最善の方法は、この警告を完全に無効にすることです(正しいコマンドラインオプションについては、@ pmgの回答を参照してください)。 GCCに取り組んでいる誰かが明確に考えていませんでした。つまり、私はその警告の価値を理解しています(実際には非常に役立つ可能性があります)が、{ 0 }
の機能を壊すことは受け入れられません。 { 0 }
には特別な扱いが必要です。
gccは迷惑です。警告なしでそれを受け入れる必要があります。
これを試して
STRUCTA array[MAX] = {{0}};
そのgccの動作は、オプション-Wmissing-braces
または-Wno-missing-braces
で制御できます。
-Wall
はこの警告を有効にします。 -Wall
を使用して、中かっこがない場合は、-Wall -Wno-missing-braces
を使用します
これは単にgccによって発行された有害な警告であり、-Wno-braces
を使用して無効にします。 {0}
は、コードで認識されていないタイプの定義に非常に役立つ「ユニバーサルゼロ初期化子」であり、gccがその使用を推奨しないことは、優れたコードの追求に積極的に有害です。
Gccがこの警告を保持したい場合は、少なくとも特殊なケース{0}
を使用し、この1つのケースでは警告を無効にする必要があります。
配列は中括弧で初期化されますが、構造体も初期化されます。おそらく、0の周りに追加のブレースのセットを配置する必要があり、STRUCTA
の定義方法によっては、いくつかの追加の0をコンマで区切ってください。
それはSTRUCTAに依存します。例えば :
typedef struct structa
{
int a, b;
} STRUCTA;
int main (int argc, char const* argv[])
{
STRUCTA array[10] = {{0,0}};
return 0;
}
完全に空のブレースを使用することで警告を回避できます。
STRUCTA配列[10] = {};
配列は aggregate-initialized になります。つまり、配列内の各構造体は value-initialized になります。空の括弧で値を初期化すると、各構造体の aggregate-initializion に変わり、すべてのフィールドが0に設定されます。
これは、構造体がPODである限り、すべてのケースで機能します(正確な説明については、上記のリンクを参照してください)。
STRUCTAを0に割り当てることはできますか?
常にmemset()も使用できます。