2016-08-11 10 views
6

Я бы сказал, что у меня есть промежуточный опыт программирования в c, однако я никогда не видел этот синтаксис, используемый ранее, чтобы сделать функцию. Это напоминает синтаксис события JQuery. В целом, я хотел бы получить подробное объяснение того, что это такое и что может быть альтернативным синтаксисом. Ссылка на то, где я могла бы больше узнать об этом, в частности, тоже была бы замечательной.Что это за синтаксис функции C?

// Set handlers to manage the elements inside the Window 
window_set_window_handlers(s_main_window, (WindowHandlers) { 
    .load = main_window_load, 
    .unload = main_window_unload 
    }); 

Это фрагмент кода из Pebble WatchApp tutorial.

+0

Я думаю, что это делает на структуру, отбрасывая в 'WindowHandlers', и передать его в том, что function – Alex

+3

@Alex - Нет, это сложный литерал. И, кстати, это вызов функции AFAIK. Никакой функции не производится, но вместо этого вызывается. Второй аргумент функции представляет собой составной литерал. – AnArrayOfFunctions

+2

'window_set_window_handlers' имеют 2 параметра' s_main_window' и struct 'WindowHandlers', здесь инициализируется структура' WindowHandlers' – fedi

ответ

10

Это вызов функции, использующий составной литерал. Это эквивалентно следующему:

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 }; 
+0

Не могли бы вы объяснить, что означают значения ведущих периодов для переменных? – user1717828

+0

@ user1717828 Они определяют, какие поля в инициализированной структуре должны быть установлены. – dbush

5

Это стандартное от C99 и выше. Это объединение составных литералов:

(WindowHandlers) {} 

и назначенных инициализаторами:

.load = main_window_load, 
.unload = main_window_unload 

Смотрите ссылку What does this dot syntax mean in the Pebble watch development tutorial?

+1

Ну, это стандартный C, ** введен ** с C99 (но все еще действительный). – Olaf

 Смежные вопросы

  • Нет связанных вопросов^_^