C: pointeur vers struct dans la définition de la structure

Comment puis-je avoir un pointeur sur la structure suivante dans la définition de cette structure:

typedef struct A { int a; int b; A* next; } A; 

c’est comme ça que je l’ai écrit pour la première fois, mais ça ne marche pas.

Vous pouvez définir typedef et forward déclarez la structure d’abord dans un état, puis définissez la structure dans une définition ultérieure.

 typedef struct AA; struct A { int a; int b; A* next; }; 

Edit: Comme d’autres l’ont mentionné, sans la déclaration directe, le nom de la structure est toujours valide dans la définition de la structure (vous pouvez utiliser la struct A ), mais le typedef n’est disponible qu’après la définition de typedef t être valide). Cela n’a peut-être pas trop d’importance avec un seul membre de pointeur, mais si vous avez une structure de données complexe avec beaucoup de pointeurs, il peut être moins exigeant.

En plus de la première réponse, sans déclaration typedef et forward, cela devrait aller aussi.

 struct A { int a; int b; struct A *next; }; 

Vous manquez la struct avant le A*

  typedef struct A { int a; int b; struct A* next; } A; 

Vous pouvez aller sans déclaration préalable:

 struct A { int a; int b; struct A *next; }; 

S’il vous plaît, vous êtes en C, pas en C ++.

Si vous devez vraiment dactylographier une structure (et la plupart des programmeurs avec lesquels je travaille ne le feraient pas¹), faites ceci:

 typedef struct _A { int a; int b; struct _A *next; } A; 

pour différencier clairement entre _A (dans le namespace struct ) et A (dans le namespace type).

¹ typedef masque la taille et le stockage du type indiqué – l’argument (et je suis d’accord) est que dans un langage de bas niveau comme C, essayer de cacher quelque chose est nuisible et contre-productif. Habituez-vous à taper struct A chaque fois que vous parlez de struct A

 typedef struct { values } NAME; 

C’est le moyen le plus court de dactylographier une structure, je pense que c’est la notation la plus simple, mais ne placez pas le nom devant mais derrière.

vous pouvez alors l’appeler comme

 NAME n; NAME *n; // if you'd like a ptr to it. 

Quelque chose ne va pas avec cette approche?