Strukturproblem
-
Guten Abend.
Ich habe ein Problem, und zwar spucken sämtliche Compiler folgenden Fehler aus:
*error C2016: In C muss eine Struktur oder Union mindestens einen Member enthalten.
*Codestück des Errors:
typedef struct srv_handle_s { socket_t hServer; // Fehler bool_t* bActive; bool_t bAdmin; } srv_handle_t;
Codestück von socket_t:
typedef struct socket_s { int sock; int type; struct sockaddr_in info; bool_t active; size_t read; struct timeval timeout; } socket_t;
Ich versteh das Problem nict, ich sehe kein Fehler. Ich hoffe ihr findet ihn.
// Edit:
Ganz vergessen.Die Struktur socket_t kann ich überall anwenden, wenn ich diese aber in der
srv_handle_t Struktur deklariere, dann gibts den Fehler. Das heißt, wenn ich
socket_t aus der Struktur srv_handle_t nehme, funktioniert der Code.Frohes Fest :xmas1:
-
Versuch mal:
/* Forward declaration */ struct socket_s; typedef struct srv_handle_s { struct socket_s hServer; bool_t* bActive; bool_t bAdmin; } srv_handle_t;
typedef struct socket_s { int sock; int type; struct sockaddr_in info; bool_t active; size_t read; struct timeval timeout; } socket_t;
Ich denke mal, der Compiler kennt socket_t noch nicht, wenn er struct srv_handle_s verarbeitet, schätze ich zumindest mal aus dem Compile error. Aber naja, wer deutsche Compilemeldungen eingestellt hat, gehört sowieso erschossen :p
-
Danke, aber das habe ich schon probiert, hätte ich erwähnen sollen.
Der Compiler meckert dann aber wegen undefinierter Struktur, wobei die Struktur
socket_t eindeutig die Headerdatei inkludiert.Englisch war der Fehler übrigends ungefähr:
C requires at least one member in struct or union
-
Du sollst auch struct socket_s; forwarden, nicht socket_t. Zumindest hab ich das jetzt so verstanden. Wenn ned, sorry.
Schau nochmal genau hin, was ich bei dir geändert habe:
/* Forward declaration */ struct socket_s; <- HIER typedef struct srv_handle_s { struct socket_s hServer; <- HIER AUCH bool_t* bActive; bool_t bAdmin; } srv_handle_t;
-
forward declarations funktionieren nur, wenn man von ihnen nur pointer verwendet. man kann keine instanzen erzeugen, da der compiler ja deren größe nicht erkennen kann.
die lösung ist also entweder, dass du einen pointer auf socket_t in srv_handle_s verwendest, oder dass du ganz einfach socket_t vollständig vor srv_handle_s deklarierst.
-
besserwisser schrieb:
forward declarations funktionieren nur, wenn man von ihnen nur pointer verwendet. man kann keine instanzen erzeugen, da der compiler ja deren größe nicht erkennen kann.
die lösung ist also entweder, dass du einen pointer auf socket_t in srv_handle_s verwendest, oder dass du ganz einfach socket_t vollständig vor srv_handle_s deklarierst.Geht tatsächlich, ich versteh zwar nciht direkt wieso das erst so möglich ist, aber danke.
-
Oha, das wusste ich in der Tat auch nicht. Ist mir aber auch nie aufgefallen, weil ich bei solchen Dingen in 99% der Fälle Pointer verwendet .. aber gut zu wissen.