Программирование на C: Странно выглядящее объявление массива - PullRequest
2 голосов
/ 11 августа 2011

Я смотрю на исходный код в одном из файлов FFMPEG и нашел конструкцию, которая выглядит мне действительно странной. Sb, пожалуйста, объясните, что здесь происходит?

init и query_formats на самом деле являются функциями, которые были объявлены ранее в файле.

AVFilter avfilter_vf_fade = {
    .name          = "fade",
    .description   = NULL_IF_CONFIG_SMALL("Fade in/out input video"),
    .init          = init,
    .priv_size     = sizeof(FadeContext),
    .query_formats = query_formats,

    .inputs    = (AVFilterPad[]) {{ .name            = "default",
                                    .type            = AVMEDIA_TYPE_VIDEO,
                                    .config_props    = config_props,
                                    .get_video_buffer = avfilter_null_get_video_buffer,
                                    .start_frame      = avfilter_null_start_frame,
                                    .draw_slice      = draw_slice,
                                    .end_frame       = end_frame,
                                    .min_perms       = AV_PERM_READ | AV_PERM_WRITE,
                                    .rej_perms       = AV_PERM_PRESERVE, },
                                  { .name = NULL}},
    .outputs   = (AVFilterPad[]) {{ .name            = "default",
                                    .type            = AVMEDIA_TYPE_VIDEO, },
                                  { .name = NULL}},
};

Что такое "." делать там. Как бы вы получили доступ ко всем этим пунктам. Что будет сохранено в отсеках массива (указатели адресов?!)?

Я немного запутался ..

Кроме того, как вы узнаете, как работает код стороннего программиста, если вокруг практически нет комментариев? Документации тоже не существует ..

PS: Так выглядит функция init:

static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
{
...
}

Ответы [ 2 ]

6 голосов
/ 11 августа 2011

Это C99.

Позволяет инициализировать структуры по имени.

Например, структура:

struct foo {
   int x,y;
   char *name;
};

Можно инициализировать как:

struct foo f = { 
 .name = "Point",
 .x=10,
 .y=20
};

Для этого требуется современный компилятор, который поддерживает самые последние стандарты: C99.

1 голос
/ 11 августа 2011

Он называется назначенным инициализатором и является частью стандарта C99. Посмотрите здесь , чтобы узнать больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...