Это вызов функции, использующий составной литерал. Это эквивалентно следующему:
WindowHandlers temp = {
.load = main_window_load,
.unload = main_window_unload
};
window_set_window_handlers(s_main_window, temp);
Вышесказанное также использует назначенные инициализаторы, где вы можете указать поля для инициализации по имени.
Предполагая, что WindowHandlers
содержит только load
и unload
в таком порядке, указанное эквивалентно:
WindowHandlers temp = { main_window_load, main_window_unload };
window_set_window_handlers(s_main_window, temp);
C standard переходит в них более подробно.
Из секции 6.5.2.5:
Выражение постфикса, который состоит из типа скобки имени, за которым следует распорной-закрытый список инициализаторах является соединение буквальным. Он предоставляет неназванный объект, значение которого составляет , заданное в списке инициализаторов.
...
Пример 1. Определение области видимости файла
int *p = (int []){2, 4};
инициализирует p
, чтобы указывать на первый элемент массива два целых чисел, первое, имеющее значение двух второй, четыре. Выражения в этом составном литерале должны быть постоянными . У неназванного объекта есть статическая продолжительность хранения.
из раздела 6.7.8:
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designationopt initializer
initializer-list , designationopt initializer
designation:
designator-list =
designator-list:
designator
designator-list designator
designator:
[ constant-expression ]
.identifier
...
Если указатель имеет вид
.identifier
то текущий объект (определенный ниже) должен иметь структуру или тип объединения, а идентификатор должен быть именем члена такого типа.
...
Пример 10 члены Структуры могут быть инициализированы ненулевыми значения вне зависимости от их порядка:
div_t answer = { .quot = 2, .rem = -1 };
Я думаю, что это делает на структуру, отбрасывая в 'WindowHandlers', и передать его в том, что function – Alex
@Alex - Нет, это сложный литерал. И, кстати, это вызов функции AFAIK. Никакой функции не производится, но вместо этого вызывается. Второй аргумент функции представляет собой составной литерал. – AnArrayOfFunctions
'window_set_window_handlers' имеют 2 параметра' s_main_window' и struct 'WindowHandlers', здесь инициализируется структура' WindowHandlers' – fedi