typedef vor struct gültig???
-
typedef struct x_ x;
#include "xxx.h"
struct x_
{
...
};ist so ein code gültig?
immerhin wird "x" definiert, bevor "x_" überhaupt bekannt ist.
in include wird dann "x" verwendet.Mit MinGW lässt sich das ohne Fehler kompilieren.
Ich hab es jetzt so gemacht, weil ich ansonsten "struct x_" in include schreiben müsste - weil es wiederum dieses include verwendet.
-
Ja, ist gültig. wenn du mit dem MinGW/gcc kompilierst, benutze -Wall -pedantic, dann wird eigentlich alles nicht-legale, nicht-standardkonforme bemängelt.
Aber was du da mit dem Header machst sieht schon wüst aus.
-
wieso sieht es wüst aus???
ich habe eine linked list - und da hat man sozusagen "kreuzende" structs
für parent habe ich ein include mit c-file für die entspr. funktionen
und für child-objekte habe ich andere includes und c-files mit enspr. funktionen...nun benötigen child-objekte das header vom parent
und parent benötigt das header vom childsomit müsste ich überall "struct typename" schreiben - was sehr hässlich aussieht
mit typedef bringe ist da etw. übersicht rein - jedoch muß es vor includes stehen - sonst greift es nicht... (wegen den function-deklaraionen)
-
Hm typedef scheint wohl eine Ausnahme bei der C Programmierung sein - es benötigt keine identifier, die vorher existiert haben...
selbst das geht:
typedef struct mystr mystr;
struct mystr
{
...
};ich finde es jedoch komisch
-
TheShadow2000 schrieb:
Hm typedef scheint wohl eine Ausnahme bei der C Programmierung sein - es benötigt keine identifier, die vorher existiert haben...
Nein, es ist keine Ausnahme, und es hat auch nichts mit typedef zu tun. Wenn du irgendwo "struct mystr" schreibst, machst du eine Vorausdeklaration dieses Typs. Egal, ob du das explizit tust (wie man das in C++ oft sieht):
struct mystr;
oder als Teil irgendeiner anderen Deklaration:
void foo(struct mystr*);
Der Typ ist nach wie vor unvollständig, du kannst also nicht viel damit anfangen, außer z.B. Pointer darauf deklarieren. Und typedefs. Er wird erst vollständig in dem Moment, in dem der Compiler die ganze struct-Definition sieht.
-
Danke Bashar, du hast mir geholfen...
aber warum zum Teufel wird in anderen Codes (z.B. cairo) nicht so gemacht wie ich es geschrieben habe (also typedef vor includes).
Wie ich sehe hat es Vorteile - dadurch wird der Code bisschen kleiner und besser lesbar - denn dann kann man auf das Schlüsselwort struct bei var-deklarationen ganz verzichten...
In cairo wird dank typedef auch immer struct weggelassen - jedoch bei linked lists ist es z.B. wieder drin...
ich finde es so wie ich oben geschrieben viel viel übersichtlicher... und einheitlicher...