57 votes

C: pointeur à struct dans la définition de struct

Comment puis-je avoir un pointeur sur la prochaine structure 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.

77voto

Charles Bailey Points 244082

Vous pouvez définir la définition de type et de déclarer avant la struct tout d'abord dans une déclaration, puis définir la structure dans une définition ultérieure.

typedef struct A A;

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

Edit: Comme d'autres l'ont mentionné, sans les declaratation la struct nom est encore valable à l'intérieur de la structure de la définition (c'est à dire que vous pouvez utiliser struct A), mais la définition de type n'est pas disponible jusqu'à ce que après la définition de type de définition est complète (et donc, en utilisant seulement A ne serait pas valide). Ce n'est pas trop grave trop avec juste un pointeur de membre, mais si vous avez une structure de données complexe, avec beaucoup d'auto-type des pointeurs, peut-être moins wieldy.

65voto

Chris Young Points 8525

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

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

21voto

Miles D Points 3583

Il vous manque le struct avant le A*

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

14voto

qrdl Points 17813

Vous pouvez aller sans déclaration préalable:

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

9voto

ephemient Points 87003

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

Si vous devez vraiment un typedef struct (et la plupart des programmeurs que je travaille avec not1), faites ceci:

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

pour distinguer l' _A (en struct d'espace de noms) et A (dans l'espace de noms du type).

1typedef masque de la taille et de stockage du type il des points à l'argument (et je suis d'accord), c'est que dans un langage de bas niveau comme le C, en essayant de cacher quoi que ce soit est dangereux et contre-productif. S'habituer à taper struct A chaque fois que vous entendez struct A.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X