Странное определение структуры

В примере кода Intel DPDK я обнаружил эту странную синтаксическую конструкцию. Кто-нибудь может объяснить мне, что это значит?

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

Ответы на вопрос(3)

назначенный инициализатор.

В более ранних стандартах C элементы инициализатора структуры должны были появляться в том же порядке, что и в определении структуры. С назначенными инициализаторами это ограничение снимается. Естественно, члены структуры должны быть названы, чтобы указать, какой элемент инициализируется.

Назначенные инициализаторы также могут использоваться с массивами и позволяют вам инициализировать определенные элементы массива. Например:

int a[6] = { [4] = 29, [2] = 15 };
Решение Вопроса

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

Вы можете инициализировать объект следующим образом:

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

Но это означает, что вам нужно знать порядок переменных вX а также иметь начальное значение для всего этого. Кроме того, вы можете инициализировать так:

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

Таким образом, вы можете инициализировать переменные-члены в любом порядке или даже пропустить некоторые.

Это особенно полезно в библиотеке, где у вас есть некоторые переменные, которые должны быть инициализированы пользователем, в то время как другие переменные являются более внутренними и могут даже изменяться в других версиях вашей библиотеки. Используя этот тип инициализации, пользователю не нужно знать об этих дополнительных переменных.

designated initializers, Это позволяет вам указывать имена полей, для которых вы устанавливаете значения, а не указывать значения в том порядке, в котором соответствующие поля появляются в объявлении. Кроме того, этот синтаксис позволяет инициализировать членов союзов, отличных от первого, что было невозможно до C99.

Ваш ответ на вопрос