Como parte de responder a otra pregunta, me encontré con un código como este, que gcc compila sin quejarse.¿Cómo es legal hacer referencia a un tipo indefinido dentro de una estructura?
typedef struct {
struct xyz *z;
} xyz;
int main (void) {
return 0;
}
Este es el medio que siempre he utilizado para construir tipos que apuntan a sí mismos (por ejemplo, listas enlazadas), pero siempre he pensado que tenía que nombre de la estructura lo que podría utilizar autorreferencia . En otras palabras, no puede usar xyz *z
dentro de la estructura porque el typedef aún no está completo en ese punto.
Pero esta muestra particular hace no nombre la estructura y aún compila. Al principio pensé que había algo de magia negra en el compilador que traducía automáticamente el código anterior porque la estructura y los nombres typedef eran los mismos.
Pero esta pequeña belleza funciona así:
typedef struct {
struct NOTHING_LIKE_xyz *z;
} xyz;
Qué me estoy perdiendo aquí? Esto parece una clara violación ya que no hay ningún tipo de struct NOTHING_LIKE_xyz
definido en ninguna parte.
Cuando cambio desde un puntero a un tipo real, me sale el error esperado:
typedef struct {
struct NOTHING_LIKE_xyz z;
} xyz;
qqq.c:2: error: field `z' has incomplete type
Además, cuando quito la struct
, me sale un error (parse error before "NOTHING ...
).
¿Está permitido en ISO C?
Actualización: Un struct NOSUCHTYPE *variable;
también compila por lo que es no sólo dentro estructuras en los que parece ser válida. No puedo encontrar nada en el estándar c99 que permita esta indulgencia con los indicadores de estructura.
El segundo y el tercer bloque de códigos son idénticos. – badp
Lo siento, solucionado eso. Cut'n'paste error de usuario. – paxdiablo
+1, esa pregunta dejó a varias personas rascándose la cabeza (yo incluido). –