sizeof einzelnen struct-member in C
Ich versuche zu erklären, eine Struktur, die abhängig von anderen struct.
Ich will sizeof
um sicher zu sein/pedantisch.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Nun möchte ich deklarieren struct child_t
hat die gleiche Größe wie parent_t.text
.
Wie kann ich dies tun? (Pseudo-code unten).
typedef struct _child
{
char flag ;
char text[sizeof(parent_t.text)] ;
int used ;
} child_t ;
Ich habe versucht ein paar verschiedene Möglichkeiten, mit parent_t
und struct _parent
, aber mein compiler nicht akzeptieren.
Als ein trick, das scheint zu funktionieren:
parent_t* dummy ;
typedef struct _child
{
char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;
Ist es möglich zu erklären child_t
ohne den Einsatz von dummy
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl die Festlegung der Puffergröße mit einem
#define
ist ein idiomatischer Weg, es zu tun, eine andere wäre ein makro wie dieses:und verwenden Sie es wie diese:
Ich bin eigentlich ein bisschen überrascht, dass
sizeof((type *)0)->member)
ist sogar erlaubt, da ein konstanter Ausdruck. Coole Sachen.sizeof
wird nicht ausgewertet, es gibt also kein Problem mit der Dereferenzierung der null-Zeiger (denn es ist eigentlich nicht dereferenziert).Ich bin nicht auf meiner Entwicklungs-Maschine jetzt, aber ich denke, man kann eines der folgenden:
Bearbeiten: ich mag die member_size makro Joey schlug die Verwendung dieser Technik, ich denke, ich würde die verwenden.
parent_t *
, nicht_parent *
.Verwenden Sie eine Präprozessor-Direktive, d.h. #define:
drand48_data
(definiert in stdlib.h), und wollen Sie den sizeof -__x
. Sie können nicht#define X_LEN 3
und ändern der stdlib.h, mitmember_size
überlegen ist, wenn Sie nicht haben Zugang zu der Quelle des übergeordneten Struktur, die scheint wie eine vernünftige situation.Sind Sie frei zu verwenden
FIELD_SIZEOF(t, f)
im Linux-kernel.Es ist nur wie folgt definiert:
Diese Art von makro ist bereits in anderen Antworten. Aber es ist mehr tragbar zu verwenden, ein bereits definiertes makro.
Können Sie eine Präprozessor-Direktive für Größe:
und verwenden Sie es in beide Eltern und Kind.
/usr/include/bits/dirent.h
die Größe derd_name
Feld (structdirect
/dirent
) ist nicht definiert alsDIRSIZ
mehr, sondern hart codiert; sosizeof()
scheint der einzige saubere Weg, um die AbhängigkeitAndere Möglichkeit wäre, einen Typ definieren. Die Tatsache, dass Sie wollen sicherstellen, dass die gleiche Größe für die beiden Felder ist ein Indikator dafür, dass Sie die gleiche Semantik haben für Sie, denke ich.
haben und dann ein Feld
in beiden Typen.
struct.h
hat Sie bereits definiert sind,so könnte man,
aber, auf der Suche in der Kopfzeile, es scheint, dass dies ist ein BSD-Sache und nicht die ANSI-oder POSIX-standard. Ich versuchte es auf einer Linux-Maschine und es hat nicht funktioniert; von begrenztem nutzen.
c++ - Lösung:
sizeof(Type::Mitglied) zu sein scheint, so gut funktioniert:
@joey-adams, ich danke Ihnen!
Ich war auf der Suche die gleiche Sache, aber für nicht char-array und es funktioniert einwandfrei sogar auf diese Weise:
Es gibt 20 zurück, wie erwartet.
Und @brandon-horsley, dies funktioniert auch gut: