struct test hello = (struct test) { .i = 0, .t = 1 };
использует две функции C, называемые составные литералы и обозначенные инициализаторы .
Общая форма составного литерала: (
имя типа )
{
список инициализаторов }
.(Также может быть запятая после списка.) Например, это составные литералы:
(int) { 3 }
(int []) { 0, 1, 2 }
(union { float f; unsigned int u; }) = { 3.4 }
Составной литерал - это объект без имени.
В простом списке инициализаторавы просто перечисляете значения для элементов в инициализируемом объекте.Однако вы также можете использовать назначенные инициализаторы.Назначенный инициализатор использует либо имя элемента структуры, либо индекс элемента массива, чтобы указать, какой части объекта должно быть присвоено указанное значение:
{ struct { int a, b, c; }) = { .b = 4, .c = 1, .a = 9 }
(int a[1024]) = { [473] = 1, [978] = -1 }
Итак, в struct test hello = (struct test) { .i = 0, .t = 1 };
мысоздаем struct test
с i
, инициализированным в 0, и t
, инициализированным в 1. Затем этот struct test
используется для инициализации другого структурного теста с именем hello
.
Это конкретное использование бессмысленно,поскольку он создает временный объект с целью чего-то, что могло бы быть сделано напрямую.Номинально он создает временный struct test
, который инициализируется, а затем копируется в struct test hello
.Тогда временный struct test
больше не используется.Эффект такой же, как простое написание struct test hello = { .i = 0, .t = 1};
.Это инициализирует hello
без использования временного объекта.Однако хороший компилятор оптимизирует их под тот же код.