web-dev-qa-db-ger.com

C: Zeiger auf struct in der struct-Definition

Wie kann ich einen Zeiger auf die nächste Struktur in der Definition dieser Struktur haben:

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

so habe ich es zuerst geschrieben, aber es funktioniert nicht.

46
claf

Sie können das Typedef definieren und die Struktur zuerst in einer Anweisung vorwärts deklarieren und dann in einer nachfolgenden Definition die Struktur definieren.

typedef struct A A;

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

Bearbeiten: Wie bereits erwähnt, ist der Strukturname ohne die Forward-Deklaration in der Strukturdefinition noch gültig (dh Sie können struct A verwenden), aber die Typedef ist erst verfügbar, nachdem die Typedef-Definition abgeschlossen ist (also würde die Verwendung von A nicht verwendet werden) gültig sein). Mit nur einem Zeigermember ist dies möglicherweise nicht so wichtig. Wenn Sie jedoch eine komplexe Datenstruktur mit vielen Zeigern vom Selbsttyp haben, ist dies möglicherweise weniger wendig.

64
CB Bailey

Abgesehen von der ersten Antwort, ohne Typedef und Vorwärtsdeklaration, sollte dies ebenfalls in Ordnung sein.

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

Ihnen fehlt die struct vor dem A*

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

Sie können ohne Vorwärtsdeklaration gehen:

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

Bitte, Sie sind in C, nicht in C++.

Wenn Sie wirklich eine Struktur typen müssen (und die meisten Programmierer, mit denen ich arbeite, nicht¹), machen Sie folgendes:

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

um eindeutig zwischen _A (im struct-Namespace) und A (im Typ-Namespace) zu unterscheiden.

¹typedef verbirgt die Größe und den Speicher des Typs, auf den er verweist. Das Argument (und ich stimme zu) ist, dass der Versuch, alles zu verbergen, in einer einfachen Sprache wie C schädlich und kontraproduktiv ist. Gewöhnen Sie sich an die Eingabe von struct A, wenn Sie struct A meinen.

8
ephemient

Verwenden Sie den folgenden Präprozessor:

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

Verwendungszweck: 

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

Dies ist ein kürzerer Weg, um eine Struktur zu schreiben, die meiner Meinung nach die einfachste Notation ist. Setzen Sie den Namen nicht in den Vordergrund, sondern hinter ihm.

du kannst es dann gerne anrufen 

NAME n;  

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

Irgendetwas stimmt mit diesem Ansatz nicht?

0
user7296055