以下の 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};
以下の 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};
これは GCC バグ # 53119 です:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119
修正を希望する場合は、バグ レポートにフォローアップを投稿して、自分の問題であることを示してください。
構造体の最初のメンバーは配列であるため、次のものが必要です。
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にあるかどうかを検出し、自動的にゼロにすることができます(これは関数のスタックまたはグローバルメモリにあります) )。