Dans le cadre de la réponse à une autre question, je suis tombé sur un morceau de code comme celui-ci, que gcc compile sans se plaindre.Comment est-il légal de référencer un type indéfini dans une structure?
typedef struct {
struct xyz *z;
} xyz;
int main (void) {
return 0;
}
Ce sont les moyens que je l'ai toujours utilisé pour construire des types qui pointent vers eux-mêmes (par exemple, des listes liées) mais j'ai toujours pensé que vous deviez nom struct pour que vous puissiez utiliser l'auto-référence . En d'autres termes, vous ne pouvez pas utiliser xyz *z
dans la structure car le typedef n'est pas encore terminé à ce stade.
Mais cet exemple particulier pas nomme la structure et il compile encore. Je pensais à l'origine qu'il y avait de la magie noire dans le compilateur qui traduisait automatiquement le code ci-dessus parce que la structure et les noms de typedef étaient les mêmes.
Mais cette petite beauté fonctionne aussi bien:
typedef struct {
struct NOTHING_LIKE_xyz *z;
} xyz;
Qu'est-ce que je manque ici? Cela semble une violation claire puisqu'il n'y a aucun type struct NOTHING_LIKE_xyz
défini n'importe où.
Quand je changerai d'un pointeur vers un type réel, je reçois l'erreur attendue:
typedef struct {
struct NOTHING_LIKE_xyz z;
} xyz;
qqq.c:2: error: field `z' has incomplete type
Aussi, lorsque je retire le struct
, je reçois une erreur (parse error before "NOTHING ...
).
Est-ce autorisé dans ISO C?
Mise à jour: Une struct NOSUCHTYPE *variable;
compile également il est donc pas seulement à l'intérieur structures où il semble être valide. Je ne trouve rien dans la norme c99 qui permette cette clémence pour les pointeurs de structure.
Les deuxième et troisième blocs de code sont identiques. – badp
Désolé, réparé cela. Cut'n'paste erreur de l'utilisateur. – paxdiablo
+1, Cette question a laissé plusieurs personnes se gratter la tête (moi inclus). –