две структуры, которые относятся друг к другу - PullRequest
0 голосов
/ 10 июля 2020

Как я могу иметь две разные структуры, которые ссылаются друг на друга? Один содержит указатель на другой, и у меня также есть предварительное объявление:

struct json_array_t; 

struct json_array_entry_t {
    enum json_type type;                
    union {
        bool                boolean; 
        long long           integer; 
        double              floating; 
        char*               string; 
        struct json_array_t array; 
    }; 
}; 

struct json_array_t {
    struct json_array_entry_t* entries; 
    size_t len, cap;
};

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

error: field ‘array’ has incomplete type
   27 |         struct json_array_t array;

Ответы [ 3 ]

3 голосов
/ 10 июля 2020

Сначала вы должны определить struct json_array_t, а затем struct json_array_entry_t.

Теперь, когда вы определяете в struct json_array_entry_t вхождение json_array_t, оно и все его члены полностью известны компилятору.

1 голос
/ 10 июля 2020

Компилятору необходимо знать точный размер struct json_array_t, чтобы определить, сколько памяти ему необходимо выделить для элемента union внутри структуры json_array_entry_t и с учетом того, сколько памяти ему необходимо выделить для объекта. структуры json_array_entry_t в целом.

Простого прямого объявления struct json_array_t в этом случае недостаточно.

Поместите определение struct json_array_t

struct json_array_t {
    struct json_array_entry_t* entries; 
    size_t len, cap;
};

до определения struct json_array_entry_t. Таким образом, компилятор знает размер структуры json_array_t, и вы также можете избавить его от прямого объявления.

Поскольку entries - это всего лишь указатель, вам не нужно предварительное объявление для json_array_entry_t.

struct json_array_t {
    struct json_array_entry_t* entries; 
    size_t len, cap;
};

struct json_array_entry_t {
    enum json_type type;                
    union {
        bool                boolean; 
        long long           integer; 
        double              floating; 
        char*               string; 
        struct json_array_t array; 
    }; 
}; 
1 голос
/ 10 июля 2020

Вы можете определить json_array_entry_t перед json_array_t, так как вы просто будете использовать его как указатель внутри json_array_t

#include <stdio.h>
#include <stdbool.h>

// just an example
enum json_type {
  _BOOL, _INT, _DOUBLE, _STRING, _ARRAY
};

struct json_array_entry_t;

struct json_array_t {
  struct json_array_entry_t* entries; 
  size_t len, cap;
};

struct json_array_entry_t {
  enum json_type type;                
  union {
    bool                boolean; 
    long long           integer; 
    double              floating; 
    char*               string; 
    struct json_array_t array; 
  }; 
}; 

int main() {
  // some coding
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...