2009-09-14 5 views

Antwort

18

Im ersten Fall kann nur die Variable x von diesem Typ sein - streng genommen, wenn Sie eine andere Struktur y mit demselben Körper definieren, wäre es ein anderer Typ. Sie verwenden es also, wenn Sie keine anderen Variablen des gleichen Typs benötigen. Beachten Sie, dass Sie keine Objekte auf diesen Typ anwenden, Funktionen mit Prototypen, die diesen Typ verwenden, deklarieren oder definieren oder sogar Variablen dieses Typs dynamisch zuweisen können - es gibt keinen Namen für den zu verwendenden Typ.

Im zweiten Fall definieren Sie keine Variable - Sie definieren nur einen Typ struct x, der dann verwendet werden kann, um so viele Variablen zu erstellen, wie Sie für diesen Typ benötigen. Dies ist natürlich der Normalfall. Es wird oft in Verbindung mit, oder in Verbindung mit einem typedef:

typedef struct x 
{ 
    char a; 
    int b; 
} x; 

Normalerweise würden Sie ein informativen Tag-Namen und Typnamen verwenden. Es ist vollkommen legal und sicher, denselben Namen für das Struktur-Tag (das erste 'x') und den Typ-Namen (das zweite 'x') zu verwenden.

Um eine erste Näherung, C++ erstellt automatisch eine typedef für Sie, wenn Sie die einfache 'struct x {...};' Notation (unabhängig davon, ob Sie Variablen gleichzeitig definieren). Für ausführlichere Details zu den Vorbehalten im Zusammenhang mit dem Begriff "erste Annäherung" siehe die ausführlichen Kommentare unten. Danke an alle Kommentatoren, die mir geholfen haben, dies zu klären.

+0

don 't wissen über erste Falldetails, danke für das Aufzeigen – chester89

+0

Gute Erklärung. Beachten Sie auch, dass Sie es zum ersten Mal nicht im Namensraumbereich platzieren können. –

+0

"C++ macht das automatisch für Sie, wenn Sie die einfache 'struct x {...};' Notation "Es sei denn, es ist eine Funktion mit dem gleichen Namen sichtbar, in diesem Fall kann C++ nur 'struct x' als Typenname verwenden, nicht x allein, genau das gleiche wie C. –

4

Im ersten Fall, dass Sie eine Variable deklarieren. In der Sekunde, ein Typ. Ich denke, ein besserer Ansatz wäre:

typedef struct tag_x { 
    char a; 
    int b; 
} x; 
+1

OK, aber was ist mit der Frage: Warum würden Sie eine Struktur in eine Richtung statt in eine andere definieren? –

+0

Warum verwenden Sie "tag_x" und "x", um auf dasselbe zu verweisen. Die Tags structure, union und enum befinden sich in einem separaten Namespace von dem normalen Bezeichner-Namespace, in dem typedefs definiert ist. Es gibt also keinen Konflikt - und C++ erzeugt effektiv 'typedef struct x {...} x;' automatisch. –

+0

Könnte gut zu bearbeiten sein, um die Verwendung zu enthalten: x my_struct; my_struct.a = 'a'; my_struct.b = 1; – ThePosey

2

Die erste bis

struct unnamed_struct { char a; int b;}; 
unnamed_struct x; 

äquivalent ist nur, dass der Strukturtyp hat keinen Namen.

+1

Nur in C++; In C benötigen Sie 'struct unnamed_struct x;'. –

4

Die erste definiert eine Variable namens 'x', deren Typ eine unbenannte Struktur ist.

Die zweite definiert eine Struktur mit dem Namen x, definiert aber nichts, das sie verwendet.

2

Die zwei verschiedene Dinge tun:

struct { 
    char a; 
    int b; 
} x; 

deklariert eine Variable vom Typ xstruct { char a; int b; }

struct x { 
    char a; 
    int b; 
}; 

Deklariert eine Typstruct x. Um eine Variable dieses Typs zu bekommen, würden Sie später brauchen, dies zu tun:

struct x x = {0}; 
x x = {0}; // C++ only 

Das zweite ist häufiger, weil es Erklärungen kürzer machen, vor allem, wenn Sie Ihre Struktur ändern. Die erste wird verwendet, wenn Sie die Struktur nie wieder benötigen und Ihren Namensraum nicht verschmutzen wollen. Also im Grunde nie.

Verwandte Themen