Definición de estructura extraña

En el ejemplo de código de Intel DPDK he encontrado esta extraña construcción sintáctica. ¿Alguien me puede explicar qué significa?

static const struct rte_eth_conf port_conf = { .rxmode = { .split_hdr_size = 0, .header_split = 0, .hw_ip_checksum = 0, .hw_vlan_filter = 0, .jumbo_frame = 0, .hw_strip_crc = 0, }, .txmode = { } }; 

Si usted tiene

 struct X { type_a var_a; type_b var_b; type_c var_c; type_d var_d; }; 

puedes inicializar un objeto como este:

 struct X x = {value_a, value_b, value_c, value_d}; 

Pero esto significa que necesita conocer el orden de las variables en X y tener un valor inicial para todo esto. Alternativamente, puedes inicializar así:

 struct X x = { .var_a = value_a, .var_b = value_b, .var_c = value_c, .var_d = value_d }; 

De esta manera, puede inicializar las variables miembro en cualquier orden, o incluso omitir algunas.

Esto es especialmente útil en una biblioteca en la que el usuario debe inicializar algunas variables, mientras que otras son más internas e incluso podrían cambiarse con diferentes versiones de su biblioteca. Al usar este tipo de inicialización, el usuario no necesita conocer esas variables adicionales.

Es una syntax C99 conocida como un inicializador designado .

En los estándares C anteriores, los elementos de un inicializador de estructura tenían que aparecer en el mismo orden que en la definición de estructura. Con los inicializadores designados, esa restricción es levantada. Naturalmente, los miembros de la estructura deben ser nombrados para indicar qué miembro se está inicializando.

Los inicializadores designados también se pueden usar con matrices y le permiten inicializar elementos específicos de una matriz. Por ejemplo:

 int a[6] = { [4] = 29, [2] = 15 }; 

Esta es una característica de C99 llamada inicializadores designados . Le permite especificar los nombres de los campos en los que establece los valores, en lugar de especificar los valores en el orden en que aparecen los campos correspondientes en la statement. Además, esta syntax le permite inicializar miembros de uniones que no sean la primera, algo que era imposible antes de C99.