2016-01-21 3 views
-2

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

В упрощенном примере, в главной у меня есть:

#include "a.h" 

typedef struct { 
    int x; 

    int (*func)(a_t * a); 

    int y; 
} z_t; 

В ах:

#ifndef A_H_ 
#define A_H_ 

#include "z.h" 

typedef struct { 
    int b; 
    int c; 

    z_t * z; 
} a_t; 

#endif /* A_H_ */ 

и Zh:

#ifndef Z_H_ 
#define Z_H_ 

#include "a.h" 

typedef struct { 
    int x; 

    int (*func)(a_t * a); 

    int y; 
} z_t; 

#endif /* Z_H_ */ 

Я в конечном итоге с круглыми и директив #includes тип a_t неизвестен в zh

Может ли кто-нибудь помочь?

ответ

4

В C вы можете иметь круглую ссылку между двумя или более структурами или от структуры к себе. Обратите внимание, что ссылка может быть только указателем: одна структура X не может вставлять экземпляр другого, тогда как X одновременно вводит экземпляр Y. Однако X может иметь указатель на Y, тогда как Y может указывать на X или вставлять копию X.

Механизм, который допускает круговую ссылку в C, является неполной структурой типа. В C вы можете использовать struct в объявлении, не определяя тело из структуры, как это:

struct foo *bar; // foo has never been seen before. 

foo идентификатор является «структура тега». Позже передекларирование того же структуры тега в том же объеме, который делает включает тело завершит тип:

struct foo { int member; }; // foo is now complete 

С этим мы можем сделать:

struct list_node { 
    struct list_node *next, *previous; // self reference 
}; 

struct foo { 
    struct bar *bar_ptr; 
}; 

struct bar { 
    struct foo *foo_ptr; // mutual references 
}; 

В своем коде, вы не использовали один тег struct; все ваши типы структуры анонимны, и вы полагаетесь на псевдонимы typedef. Вышеуказанные ссылочные трюки не могут быть воспроизведены с использованием имен typedef; теги структуры необходимы.

Только структура, имеющая тег, может быть объявлена ​​два или более раз: неполное первое время, а затем полностью. Объявление структуры без тега анонимно; такая декларация привносит новый, уникальный тип структуры каждый раз, когда он появляется.

Смежные вопросы