Обозначенные инициализаторы и пропущенные элементы
Может кто-нибудь объяснить следующую строку о назначенных инициализаторах:
В списке инициализаторов могут отсутствовать элементы, объявленные в любом месте агрегата, а не только в конце.
Ответы
Ответ 1
Попробуйте ссылка.
Идея состоит в том, чтобы иметь возможность ссылаться на членов сложного типа, подобных структуре во время инициализации. Например.
struct s {
int a, b;
};
int main() {
struct s = { .b = 42, .a = -42 };
return 0;
}
Гибкость достигается за счет независимости порядка при указании значений. Помните, что это было добавлено к стандарту C99 и может не поддерживаться компиляторами, которые не поддерживают C99 полностью (или поддерживают более раннюю версию стандарта).
Ответ 2
Если вы используете обычный список инициализаторов, значения для элементов присваиваются по порядку, поэтому, если у вас есть эта структура:
typedef struct _foo {
int a;
int b;
} foo_t;
то этот инициализатор явно присваивает a
, а не b
:
foo_t value = { 7 };
без назначенных инициализаторов, единственными элементами, которые можно опустить, являются те, которые объявлены в конце
используя назначенные инициализаторы, вы можете опустить элементы, которые объявлены где угодно:
foo_t value = { .b = 8 };
поэтому инициализатор для value.a
опущен, несмотря на то, что он является первым значением в структуре.