Подтвердить что ты не робот

Обозначенные инициализаторы и пропущенные элементы

Может кто-нибудь объяснить следующую строку о назначенных инициализаторах:

В списке инициализаторов могут отсутствовать элементы, объявленные в любом месте агрегата, а не только в конце.

4b9b3361

Ответ 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 опущен, несмотря на то, что он является первым значением в структуре.