Größe eines struct members ohne Instanzierung ermitteln

By dose | October 20, 2006
Under: technical stuff, Uncategorized

Manchmal steht man vor dem Problem, die Größe eines einzelnen Eintrags einer Struktur wissen möchte, ohne die Struktur vorher instanzieren zu müssen, beispielsweise, um die Größe einer anderen Struktur entsprechend anzupassen.
Folgendes Beispiel soll dies verdeutlichen:

typedef struct {
char szText[10];
int iInt;
} Struct1;

typedef struct {
char szBuf[sizeof(Struct1.szText)];
long lLong;
} Struct2;

Natürlich funktioniert dieses Beispiel nicht, weil der sizeof() Operator nur auf “instanzierte” Strukturen angewandt werden kann, nicht auf die Typendefinition an sich. Was kann man in diesem Fall also tun?
Eine Funktion zur Auflösung zu schreiben fällt aus, da die Größe ja schon zur Compilezeit feststehen muss.

Nach einiger Überlegung kommt man dann zur eigentlich trivialen Lösung des Problems:
Wenn der Compiler unbedingt eine “Instanz” haben will, dann soll er sie doch mittels eines Typecasts haben.
Also erstellt man einfach einen Pointer auf die Struktur an Adresse 0, und verwendet dann wie gewohnt den sizeof()-
Operator. Folgendes Makro bewerkstelligt die Aufgabe:

#define SIZEOFMEMBER(struct_type, member) sizeof((((struct_type *)0)->member))

Die Definition von Struct2 auf dem obrigen Beispiel würde dann also folgendermaßen funktionieren:

typedef struct {
char szBuf[SIZEOFMEMBER(Struct1, szText)];
long lLong;
} Struct2;

Leave a Comment

Name:

E-Mail :

Subscribe :
Website :

Comments :