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.
Vielen Dank, das macht Sinn. –
... und vielleicht 'const * S1CPTR'. – alecov
Nur um zu bestätigen, verstehe ich. Ist das äquivalent zu 'typedef struct {...} S1; typedef S1 * S1PTR; '? – DCShannon