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

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


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

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

ошибка: элемент инициализатора не является константой
ошибка: (около инициализации для «теста»)

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

12.12.2008 13:16:14
1 ОТВЕТ
РЕШЕНИЕ

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

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

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

5
12.12.2008 13:23:45
Распределяет ли это динамически память для двух точек?
aib 16.12.2008 01:28:37
@aib: Да, он создает массив из двух буквенных «точечных» структур (со статической продолжительностью хранения, поскольку он находится в области видимости файла) и инициализирует член «foo» элемента «test», чтобы указывать на них. Это ярлык, который эквивалентен определению массива отдельно и назначению члена «foo» для указания на него.
Robert Gamble 16.12.2008 05:23:00