Éstos son algunos cambios (gracias a AndreyT):
Obviamente hay que cambiar los encabezados para hacer esta compilación. Pero incluso entonces, esto parece no ser el estándar C como AndreyT señalado. No obstante, algunos compiladores como gcc seguirán compilando como se esperaba y solo emitirán una advertencia. Del mismo modo, Microsoft no parece interpretar la norma demasiado estricta:
"declaraciones de estructuras también se pueden especificar sin declarador cuando son miembros de otra estructura o unión"
Para que sea norma C tienes que convertir tu declaración "struct yy" en una definición. Entonces su código será válido en C y en C++. Para ilustrar lo que está sucediendo, lo reescribí en una forma, en mi opinión, más comprensible y agregué una pequeña prueba sobre lo que está sucediendo.
#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;
}
Se puede ver fácilmente, que tiene una estructura yy con un puntero a xx xx y la estructura tiene un puntero a aa.Esto es equivalente a la que se puede escribir como seguido en 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;
}
Compilé con gcc y las siguientes opciones:
gcc -ansi -pedantic -Wall -W -Wshadow -Wcast-qual -Wwrite-strings test.c -o
Ambas variantes tendrán la misma salida
s: a
x: 1
s: b
Ahora, si quiere hacer lo mismo en C++, su estructura no tiene que cambiar, pero para usar la estructura interna debe llamar al operador de resolución del alcance (: :) como sigue:
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);
¿Cuál es el error –
I don'? t tiene un compilador C. Pero vi este ejemplo en un texto C diciendo que esto dará lugar a un error de compilación. – Ankur