struct audio_policy_service_ops {

audio_io_handle_t (*open_duplicate_output)(void *service,audio_io_handle_t output1,  
     int (*close_output)(void *service, audio_io_handle_t output);audio_io_handle_t output2);
     int (*suspend_output)(void *service, audio_io_handle_t output);
     int (*restore_output)(void *service, audio_io_handle_t output);
};

Теперь они инициализируются, как показано ниже:

struct audio_policy_service_ops aps_ops = {
    open_duplicate_output : aps_open_dup_output,
    close_output          : aps_close_output,
    suspend_output        : aps_suspend_output,
    restore_output        : aps_restore_output,
};
3
Pawan Kumar 22 Авг 2014 в 21:02
4
Вы не найдете такой конструкции в C++. Он существует только в C.
 – 
Mike Seymour
22 Авг 2014 в 21:06
Этот код используется в файле c++. Но да, структура "audio_io_handle_t" объявлена ​​в c-файле.
 – 
Pawan Kumar
22 Авг 2014 в 21:10
1
Этот синтаксис устарел со времен GCC 2.5. Стандартный синтаксис: .memberName = value.
 – 
chris
22 Авг 2014 в 21:11
В этом случае это нестандартное расширение, предположительно имеющее то же значение, что и обозначения C.
 – 
Mike Seymour
22 Авг 2014 в 21:11
Согласно странице GCC, это не реализовано в C++.
 – 
chris
22 Авг 2014 в 21:13

2 ответа

Лучший ответ

Это нестандартный синтаксис инициализации GCC для структур. Его в просторечии называют «синтаксисом GNU struct init старого стиля». Его стандартный эквивалент выглядит примерно так:

struct Foo bar = { .name1 = value1, .name2 = value2 };

Подробнее об этом можно прочитать в документации GCC.

7
The Paramagnetic Croissant 22 Авг 2014 в 21:12

Это GCC-изм. При инициализации структуры можно указать перед значениями инициализации имя поля структуры. Это позволяет инициализаторам следовать в случайном порядке и делает более понятным, в какое поле попадают заданные значения.

1
Hristo Iliev 22 Авг 2014 в 21:13