Вот некоторые изменения (спасибо AndreyT):
Очевидно, что вы должны изменить заголовки, чтобы сделать эту компиляцию. Но даже тогда, похоже, это не стандартный C, как указывало AndreyT . Тем не менее, некоторые компиляторы, такие как gcc, по-прежнему компилируют его, как ожидается, и выдают только предупреждение. Точно так же Microsoft не слишком интерпретирует стандарт:
«Объявления структуры также могут быть указаны без объявления, когда они являются членами другой структуры или объединения»
Чтобы сделать его стандартным C, вы должны превратить ваше объявление "struct yy" в определение. Тогда ваш код будет действительным на C и C ++. Чтобы проиллюстрировать, что происходит, я переписал это, на мой взгляд, более понятным образом и добавил небольшой тест на происходящее.
#include<stdio.h>
#include<stdlib.h>
typedef struct xx xx;
typedef struct yy yy;
struct yy{ char s; xx *p;};
struct xx{ int x; yy *q;};
int main(){
xx test;
test.q = (yy*)malloc(sizeof(yy));
test.q->s = 'a';
test.q->p = (xx*)malloc(sizeof(xx));
test.q->p->x = 1;
test.q->p->q = (yy*)malloc(sizeof(yy));
test.q->p->q->s = 'b';
printf("s: %c\n", test.q->s);
printf("x: %d\n", test.q->p->x);
printf("s: %c\n", test.q->p->q->s);
return 0;
}
Вы можете легко увидеть, что у вас есть структура yy с указателем на xx, а структура xx имеет указатель на yy. Это эквивалентно тому, что можно записать в ANSI-C следующим образом:
#include<stdio.h>
#include<stdlib.h>
int main(){
struct xx{
int x;
struct yy{
char s;
struct xx *p;
} *q;
/*Here is the change to your example. You cannot have a structur
without a declactor inside of another structur!
Your version might due to compiler extensions still work*/
};
struct xx test;
test.q = (struct yy*)malloc(sizeof(struct yy));
test.q->s = 'a';
test.q->p = (struct xx*)malloc(sizeof(struct xx));
test.q->p->x = 1;
test.q->p->q = (struct yy*)malloc(sizeof(struct yy));
test.q->p->q->s = 'b';
printf("s: %c\n", test.q->s);
printf("x: %d\n", test.q->p->x);
printf("s: %c\n", test.q->p->q->s);
return 0;
}
Я скомпилировал его с помощью gcc и следующих опций:
gcc -ansi -pedantic -Wall -W -Wshadow -Wcast-qual -Wwrite-strings test.c -o
Оба варианта будут иметь одинаковый вывод
s: a
x: 1
s: b
Теперь, если вы хотите сделать то же самое в c ++, ваша структура не должна изменяться, но для использования внутренней структуры вы должны вызвать оператор разрешения области видимости (: :) следующим образом:
test.q = (xx::yy*)malloc(sizeof(xx::yy));
test.q->s = 'a';
test.q->p = (xx*)malloc(sizeof(xx));
test.q->p->x = 1;
test.q->p->q = (xx::yy*)malloc(sizeof(xx::yy));
test.q->p->q->s = 'b';
printf("s: %c\n", test.q->s);
printf("x: %d\n", test.q->p->x);
printf("s: %c\n", test.q->p->q->s);