Cにこの構造体があり、それをすべてゼロに初期化します。不足している中括弧の警告を取り除くにはどうすればよいですか?
typedef struct {
uint32_t incoming[FRAME_TYPE_MAX];
uint32_t outgoing[FRAME_TYPE_MAX];
uint32_t timeouts;
uint32_t crc_errors;
} pkt_t;
static pkt_t stats = {0};
構造体の最初のメンバーは配列なので、次のものが必要です。
static pkt_t stats = {{0}};
外側の中括弧は構造体用で、内側の中括弧は配列用です。ただし、この猫の皮を剥ぐ方法は他にもたくさんあります。 (たとえば、静的変数はすでにゼロに初期化されています)
グローバル変数またはローカルスタティック変数の場合、自動的に初期化されます。だから、単純に:
static pkt_t stats;
1つの方法は、暗黙のゼロフィリングに依存するのではなく、中括弧内の構造体のすべてのメンバーを初期化することです。配列メンバーの場合、警告を引き起こしている可能性が高い別の{}が必要です。もう1つは警告を無効にすることですが、これは正当なバグも検出できるため推奨されません。
次のgccコンパイラフラグを設定します。-Wno-missing-braces
「info gcc」から
GNU拡張機能として、GCCは、複合リテラルによる静的ストレージ期間を持つオブジェクトの初期化を許可します(初期化子は定数ではないため、ISO C99では不可能です)。複合リテラルのタイプとオブジェクトが一致する場合、オブジェクトはブラケットで囲まれたリストでのみ初期化されました。複合リテラルの初期化リストは定数でなければなりません。初期化されるオブジェクトのサイズが不明な配列タイプの場合、サイズは複合によって決定されますリテラルサイズ。
static struct foo x = (struct foo) {1, 'a', 'b'};
static int y[] = (int []) {1, 2, 3};
static int z[] = (int [3]) {1};
上記の行は、次と同等です。
static struct foo x = {1, 'a', 'b'};
static int y[] = {1, 2, 3};
static int z[] = {1, 0, 0};
これらの初期化子を組み合わせて、配列内のすべての要素を指定することなく、配列のgcc固有の初期化を許可できる場合があります。または...必要に応じて実行時にフラグを設定して初期化するか、...変数がBSSにあり、自動的にゼロにされるかどうかを確認できます(これは関数またはグローバルメモリのスタック上にあります) )。
#define FRAME_TYPE_MAX 3
typedef struct {
uint32_t incoming[FRAME_TYPE_MAX];
uint32_t outgoing[FRAME_TYPE_MAX];
uint32_t timeouts;
uint32_t crc_errors;
} pkt_t;
static pkt_t stats1= { .incoming={5,6,20},
.outgoing={0,0,0},
.timeouts=0,
.crc_errors=0
};
static pkt_t stats2= { {5,6,20},
{0,0,0},
0,
0
};
static pkt_t stats3= {{0}};
pkt_t stats4 ; // global
int main(void)
{
stats1.incoming[0]= 35;
stats1.timeouts=25;
stats2.incoming[2]=10;
stats3.outgoing[2]=10;
stats4.timeouts=10;
for (;;);
}