Назначенные инициализаторы и пропущенные элементы - PullRequest
5 голосов
/ 18 апреля 2009

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

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

Ответы [ 2 ]

9 голосов
/ 18 апреля 2009

Если вы используете обычный список инициализаторов, значения для элементов присваиваются по порядку, поэтому, если у вас есть такая структура:

typedef struct _foo {
  int a;
  int b;
} foo_t;

тогда этот инициализатор явно присваивает a, а не b:

foo_t value = { 7 };

без обозначенных инициализаторов, единственные элементы, которые могут быть пропущены, это элементы, объявленные в конце

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

foo_t value = { .b = 8 };

поэтому инициализатор для value.a опущен, несмотря на то, что он является первым значением в структуре.

2 голосов
/ 18 апреля 2009

Попробуйте ссылку .

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

struct s {
   int a, b;
};

int main() {
  struct s = { .b = 42, .a = -42 };
  return 0;
}

Гибкость достигается за счет независимости от порядка при указании значений. Помните, что это было добавлено к стандарту C99 и может не поддерживаться компиляторами, которые не поддерживают полностью C99 (или не поддерживают более раннюю версию стандарта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...