c gcc gcc-warning

GCC falta llaves alrededor del inicializador



gcc-warning (8)

De "info gcc"

Como una extensión de GNU, GCC permite la inicialización de objetos con duración de almacenamiento estático por literales compuestos (que no es posible en ISO C99, porque el inicializador no es una constante). Se maneja como si el objeto se hubiera inicializado solo con la lista adjunta de corchetes si los tipos del compuesto literal y el objeto coinciden. La lista de inicialización del literal compuesto debe ser constante. Si el objeto que se inicializa tiene un tipo de matriz de tamaño desconocido, el tamaño se determina por el tamaño literal compuesto.

static struct foo x = (struct foo) {1, ''a'', ''b''}; static int y[] = (int []) {1, 2, 3}; static int z[] = (int [3]) {1};

Las líneas anteriores son equivalentes a lo siguiente:

static struct foo x = {1, ''a'', ''b''}; static int y[] = {1, 2, 3}; static int z[] = {1, 0, 0};

Puede combinar estos inicializadores para permitir la inicialización específica de gcc de sus matrices sin tener que especificar cada elemento en la matriz. O ... puede establecer un indicador e inicializarlo en tiempo de ejecución cuando sea necesario, o ... puede descubrir si la variable está en BSS o no y se puede poner a cero automáticamente (¿está esto en la pila en una función o en la memoria global? )

Tengo esta estructura en C a continuación que quiero inicializar a cero. ¿Cómo me deshago de la advertencia de llaves faltantes?

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};


Si se trata de una variable global o local estática, se inicializa automáticamente. Tan simplemente:

static pkt_t stats;


Una forma es inicializar cada miembro de la estructura dentro de las llaves, en lugar de confiar en el relleno cero implícito. Para los miembros de la matriz, necesitas otra {} que probablemente esté causando la advertencia. Otro es desactivar la advertencia, aunque esto no es recomendable ya que también puede detectar errores legítimos.


Como su primer miembro en la estructura es una matriz, necesita:

static pkt_t stats = {{0}};

Las llaves exteriores son para la estructura, las llaves internas son para la matriz. Sin embargo, hay muchas otras maneras de despellejar a este gato. (por ejemplo, la estática ya está iniciada a cero)



Establezca este indicador de compilador gcc: -Wno-missing-llaves


#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 (;;); }


Si todavía tiene la alegría de estar en una versión de gcc que omite esta advertencia falsa, con una estructura como esta en la pregunta puede evitar este problema con una reestructuración simple como esta:

typedef struct { uint32_t timeouts; uint32_t crc_errors; uint32_t incoming[FRAME_TYPE_MAX]; uint32_t outgoing[FRAME_TYPE_MAX]; } pkt_t; static pkt_t stats = {0};