Если тип структуры X появляется только как тип указателя в объявлении структуры или ее функциях, а код в заголовочном файле не пытается получить доступ к каким-либо переменным-членам X, то вы не должны #include Xh, а вместо этого сделать неполный объявление X (также называемое «упреждающим» объявлением) перед первым использованием X. Вот пример, в котором тип структуры Thing ссылается на X с помощью указателя:
struct X; /* incomplete ("forward") declaration */
struct Thing {
int i;
struct X* x_ptr;
};
Компилятор будет рад принять код, содержащий указатели на не полностью известный тип структуры, в основном потому, что указатели всегда имеют одинаковый размер и характеристики независимо от того, на что они указывают. Как правило, доступ к членам (или размеру) X требуется только коду в файле .c, поэтому файл .c будет #include "X.h". Это мощная техника для инкапсуляции модуля и отделения его от других модулей.
То есть он будет работать правильно, если ваш код будет выглядеть примерно так:
#include<stdio.h>
#include<stdlib.h>
struct foo; // forward declaration
struct bar
{
int a;
struct bar *next;
struct foo *ch; /* MODIFIED LINE */
};
struct foo
{
struct bar *n;
struct foo *nx;
};
int main()
{
struct bar p;
return(0);
}
Но в вашем случае struct bar имеет «элемент» типа struct foo. Следовательно, это даст поле ошибки неполного типа.
Также для информации см. приведенный ниже фрагмент (идеально работает):
#include<stdio.h>
#include<stdlib.h>
struct bar
{
int a;
struct aabar *next; /* MODIFIED LINE - aabar never declared */
struct foo *ch;
};
struct foo
{
struct bar *n;
struct foo *nx;
};
int main()
{
struct bar p;
return(0);
}
person
Arjun Mathew Dan
schedule
08.10.2014
foo
. - person Michael Ivko   schedule 05.06.2014struct foo ch
требует, чтобыfoo
было полностью определено,struct bar * n
требует только объявления бара - person Erik   schedule 05.06.2014