2009-10-09 6 views
34

ich über den folgenden Code gekommen war:C typedef der Zeiger zu strukturieren

typedef struct { 
     double x; 
     double y; 
     double z; 
} *vector; 

Ist dies eine gültige Typdefinition? Der Code wird kompiliert und läuft gut. Ich war nur neugierig, ob das gängige Praxis ist.

Antwort

51

Absolut gültig. Normalerweise können Sie durch die Definition von zwei Typen vollem Umfang nutzen diese Art und Weise nehmen zusammen:

typedef struct 
{ 
int a; 
int b; 
} S1, *S1PTR; 

Wo S1 ist eine Struktur und S1PTR ist der Zeiger auf diese Struktur.

+1

Vielen Dank, das macht Sinn. –

+0

... und vielleicht 'const * S1CPTR'. – alecov

+0

Nur um zu bestätigen, verstehe ich. Ist das äquivalent zu 'typedef struct {...} S1; typedef S1 * S1PTR; '? – DCShannon

-2

ja ... erspart Ihnen die Mühe, das Wort 'struct' immer dann einzugeben, wenn Sie die Vektorstruktur oder einen Zeiger darauf deklarieren.

+1

Ich denke, die Frage musste mehr mit der Typdefinition zu * Vektor als nur Vektor zu tun haben. –

2

Es ist eine gültige, was es tut, ist es definiert einen neuen Typ. Wie @Alex sagte, wäre es nützlich, einen Typ und einen Zeigertyp zu definieren.

Sie könnten mehr Zeiger schaffen nur durch

S1PTR ptr1, ptr2, ptr3, ...; 

statt

S1 *ptr1, *ptr2, *ptr3, ...; 
3

mit Ja es gültig ist. Wenn Sie mehr „Sicherheit“ benötigen, können Sie auch tun

typedef struct vector_{ 
     double x; 
     double y; 
     double z; 
} *vector; 

dann können Sie verwenden beide

struct vector_ *var; 
vector var; 

Aber vergessen Sie nicht die Endung Semikolon.

Wenn Sie nur typedef verwenden, bedeutet das, dass Sie es so benennen. sonst wäre es mehr oder weniger anonym.

+1

Ich glaube, Sie können den gleichen Namen für beide verwenden (d. H., Sie brauchen den Unterstrich nicht, können aber alles andere in Ihrem Code gleich lassen, da die Namespaces getrennt sind). – RastaJedi

1

Ja, es ist wie in den obigen Antworten beschrieben gültig. Ein kleiner Vorschlag, es wäre besser, wenn Sie auch einen Tag-Namen wie folgt angeben. Dies würde einigen IDEs helfen, den Code besser zu analysieren.

typedef struct vactor_tag { 
     double x; 
     double y; 
     double z; 
} *vector; 
24

Ja ist es. Aber es ist imho schlechten Stil. Nicht die direkte Deklaration der Struktur, sondern die direkte Deklaration eines Zeigertyps. Es ist eine Verschleierung, die Information, dass eine gegebene Variable oder ein Parameter ein Zeiger ist (und in geringerem Maße für Arrays) ist extrem wichtig, wenn Sie Code lesen wollen.

Bei der Überprüfung von Code ist es oft schwierig, auf den ersten Blick zu erkennen, welche Funktion einen Nebeneffekt haben könnte oder nicht. Wenn die verwendeten Typen diese Information verbergen, fügt dies dem Leser eine Gedächtnisbelastung hinzu.

int do_fancy(vector a, vector b); 

oder

int do_fancy(vector *a, vector *b); 

im ersten Fall I leicht übersehen kann, dass die Funktion der Inhalt eines oder b kann sich ändern. In der Sekunde werde ich gewarnt.

Und wenn ich eigentlich Code schreibe, weiß ich auch direkt a->x schreiben und nicht den Compiler sagen error: request for member x 'in etwas nicht eine Struktur oder Union'.

Ich weiß, es sieht aus wie eine persönliche Geschmack Sache, aber nachdem ich mit viel externem Code gearbeitet habe, kann ich Ihnen versichern, dass es extrem ärgerlich ist, wenn Sie das Indirektionslevel von Variablen nicht erkennen. Das ist ein Grund, warum ich auch C++ Referenzen nicht mag (in Java ist es nicht, weil alle Objekte als Referenz übergeben werden, es ist konsistent) und Microsofts LPCSTR Art von Typen.

+6

+1 für die Beobachtung, dass 'typedef struct {...} * obj' zu einem Typ führt, der mysteriöserweise' -> 'anstelle von' .' für den Elementzugriff benötigt. – Michael