Как объявить набор структур с нелинейной зависимостью? - PullRequest
1 голос
/ 02 июня 2019

Я смотрю на создание структур C из данных XML, вообще говоря, компилятор C должен иметь определение чего-либо до того, как он будет использован, что означает, что дерево документа XML должно быть записано, начиная с его листьев и по направлению к егоroot.

Не похоже, что разделенное определение / объявление может быть сделано из структур, похожих на функции.

Может ли это быть?

Я недостаточно знаю XMLзнать, могут ли узлы иметь круговые или вообще нелинейные отношения.Такие как «камень> ножницы», «ножницы> бумага», «бумага> камень».

Я написал несколько тестов:

struct _child
{
    char *child_name;

    struct _parent *father_reference;
};

struct _parent
{
    char *parent_name;

    struct _child *child_reference;
};

Кажется, что объявление их в порядке будет работать нормально (все ли стандарты ISO соответствуют?), если вышедшие из строя элементы являются указателями , но этого нельзя сделать с фактическими структурами:

struct _child
{
    char *child_name;

    struct _parent father;
};

struct _parent
{
    char *parent_name;

    struct _child *child_reference;
};


main.c:6:17: error: field ‘father’ has incomplete type
  struct _parent father;
                 ^~~~~~

Точно не удивительно - как бы вы рассчиталиразмер объекта, который увеличивается на его размер во время компиляции?

Может ли это быть проблемой при преобразовании определенной структуры данных XML в реализацию структуры C?

Было бы правильно сказатьчто существует строгий линейный порядок в объявлениях структуры в C?

1 Ответ

1 голос
/ 02 июня 2019

ч; вам нужны предварительные декларации.

Добавьте эти объявления вверху *:

struct _child;
struct _parent;

Однажды получив это, компилятор может обрабатывать указатели на структуры этих типов. Затем объявления вашего заголовка компилируются.

* Как только вы приступите к использованию заголовочных файлов, они идут сразу после двойной защиты. Прямо сейчас поместите их сразу после стандартных включений.

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