Стандарт языка программирования C ИСО / МЭК 9899: 1999 (широко известный как C99) позволяет использовать обозначенный инициализатор для инициализации членов структуры или объединения следующим образом:
MY_TYPE a = { .stuff = 0.456, .flag = true, .value = 123 };
Он определен в paragraph 7
, разделе 6.7.8 Initialization
стандарта ИСО / МЭК 9899: 1999 как:
Если обозначение имеет форму
, Идентификатор
тогда текущий объект (определенный ниже) должен иметь структуру или тип объединения, а идентификатор должен быть именем члена этого типа.
Обратите внимание, что paragraph 9
того же раздела гласит:
За исключением случаев, когда явно указано иное, для целей настоящего подпункта неназванные члены объектов структуры и типа объединения не участвуют в инициализации. Безымянные члены объектов структуры имеют неопределенное значение даже после инициализации.
В реализации GNU GCC пропущенные члены инициализируются как нулевое или нулевое значение, соответствующее типу. Как указано в разделе 6.27 Назначенные инициализаторы документации GNU GCC:
Пропущенные члены поля неявно инициализируются так же, как объекты со статической продолжительностью хранения.
Компилятор Microsoft Visual C ++ должен поддерживать указанные инициализаторы начиная с версии 2013 согласно официальному сообщению в блоге План соответствия C ++ . В статье Initializing unions and structs
из Инициализаторов в документации MSDN Visual Studio предполагается, что неназванные элементы инициализируются равными нулю соответствующими значениями, аналогично GNU GCC.
Стандарт ИСО / МЭК 9899: 2011 (широко известный как С11), который заменил ИСО / МЭК 9899: 1999, сохраняет обозначенные инициализаторы в разделе 6.7.9 Initialization
. Он также сохраняет paragraph 9
без изменений.
Новый Стандарт ISO / IEC 9899: 2018 (широко известный как C18), который заменил ISO / IEC 9899: 2011, сохраняет назначенные инициализаторы в разделе 6.7.9 Initialization
. Он также сохраняет paragraph 9
без изменений.