web-dev-qa-db-fra.com

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.

46
claf

Vous pouvez définir le typedef et forward déclarer la structure en premier dans une instruction, 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 déjà mentionné, sans la déclaration forward, le nom de la structure est toujours valide dans la définition de la structure (c’est-à-dire que vous pouvez utiliser struct A), mais le typedef n’est disponible qu’après la fin de la définition de typedef (si vous utilisez A être valide). Cela n’aura peut-être pas beaucoup d’importance avec un seul membre de pointeur, mais si vous avez une structure de données complexe avec de nombreux pointeurs auto-typés, il sera peut-être moins difficile à manier.

64
CB Bailey

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

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

Il vous manque la struct avant le A*

  typedef struct A {
    int a;
    int b;
    struct A* next;
  } A;
17
Miles D

Vous pouvez aller sans déclaration préalable:

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

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

Si vous devez vraiment taper une structure (et que la plupart des programmeurs avec lesquels je travaille ne le feraient pas¹), procédez comme suit:

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

distinguer clairement _A (dans l'espace de noms struct) et A (dans l'espace de noms 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 dangereux et contre-productif. Habituez-vous à taper struct A chaque fois que vous voulez dire struct A.

8
ephemient

Utilisez le préprocesseur suivant:

#define structdef(NAME) typedef struct NAME NAME; struct NAME 

Usage: 

structdef(node_t)
{
   void* value;
   node_t* next;
};
0
moien
typedef struct {
 values
} NAME;

C’est une façon plus rapide de taper une structure, je pense que c’est la notation la plus simple, mais ne mettez 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?

0
user7296055