Инициализация вложенных структур/массивов

У меня есть структура, содержащая массивы другой структуры, она выглядит примерно так:


typedef struct bla Bla;
typedef struct point Point;

struct point
{
    int x, y;
};

struct bla
{
    int another_var;
    Point *foo;
};

Теперь я хочу инициализировать их в глобальной области видимости. Они предназначены для описания модуля. Я пытался сделать это с составными литералами c99, но компилятору (gcc) это не понравилось:


Bla test =
{
    0, (Point[]) {(Point){1, 2}, (Point){3, 4}}
};

Я получаю следующие ошибки:

error: initializer element is not constant
error: (near initialization for 'test')

Поскольку мне не нужно его модифицировать, я могу поместить в него столько «const», сколько необходимо. Есть ли способ его скомпилировать?


person quinmars    schedule 12.12.2008    source источник


Ответы (1)


Вам не нужен составной литерал для каждого элемента, просто создайте один массив составных литералов:

Bla test =
{
    0, (Point[]) {{1, 2}, {3, 4}}
};

Убедитесь, что вы компилируете с -std=c99.

person Robert Gamble    schedule 12.12.2008
comment
Это динамически выделяет память для двух «точек»? - person aib; 16.12.2008
comment
@aib: Да, он создает массив из двух литеральных точечных структур (со статической продолжительностью хранения, поскольку он находится в области действия файла) и инициализирует член теста foo, чтобы он указывал на них. Это ярлык, который эквивалентен отдельному определению массива и назначению члена foo для указания на него. - person Robert Gamble; 16.12.2008