Ich versuche eine Struktur zu deklarieren, die von einer anderen Struktur abhängig ist. Ich möchte verwenden sizeof
, um sicher / pedantisch zu sein.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Jetzt möchte ich eine Struktur deklarieren child_t
, die dieselbe Größe hat wie parent_t.text
.
Wie kann ich das machen? (Pseudocode unten.)
typedef struct _child
{
char flag ;
char text[sizeof(parent_t.text)] ;
int used ;
} child_t ;
Ich habe ein paar verschiedene Möglichkeiten mit parent_t
und ausprobiert struct _parent
, aber mein Compiler wird dies nicht akzeptieren.
Als Trick scheint dies zu funktionieren:
parent_t* dummy ;
typedef struct _child
{
char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;
Ist es möglich, child_t
ohne die Verwendung von zu deklarieren dummy
?
sizeof
wird nicht ausgewertet, daher gibt es kein Problem bei der Dereferenzierung des Nullzeigers (da er nicht tatsächlich dereferenziert ist).Ich bin gerade nicht auf meiner Entwicklungsmaschine, aber ich denke, Sie können eine der folgenden Aktionen ausführen:
Bearbeiten : Ich mag das member_size-Makro, das Joey mit dieser Technik vorgeschlagen hat. Ich denke, ich würde das verwenden.
quelle
Sie können
FIELD_SIZEOF(t, f)
den Linux-Kernel verwenden. Es ist nur wie folgt definiert:Diese Art von Makro wird in anderen Antworten erwähnt. Es ist jedoch portabler, ein bereits definiertes Makro zu verwenden.
quelle
Verwenden Sie eine Präprozessor-Direktive, dh #define:
quelle
drand48_data
(definiert in stdlib.h) und Sie möchten die Größe von__x
. Sie können#define X_LEN 3
die Datei stdlib.h nicht ändern, die Verwendungmember_size
ist überlegen, wenn Sie keinen Zugriff auf die Quelle der übergeordneten Struktur haben, was als vernünftige Situation erscheint.Sie können eine Präprozessor-Direktive für die Größe verwenden als:
und verwenden Sie es sowohl bei Eltern als auch bei Kindern.
quelle
/usr/include/bits/dirent.h
die Größe desd_name
Feldes (structdirect
/dirent
) nicht mehr definiert,DIRSIZ
sondern fest codiert. sosizeof()
scheint der einzige saubere Weg , um die Abhängigkeit zu haltenstruct.h
hat sie schon definiert,so könntest du,
Beim Betrachten des Headers scheint es sich jedoch um eine BSD-Sache zu handeln und nicht um einen ANSI- oder POSIX-Standard. Ich habe es auf einem Linux-Computer versucht und es hat nicht funktioniert. begrenzte Nützlichkeit.
quelle
Eine andere Möglichkeit wäre, einen Typ zu definieren. Die Tatsache, dass Sie für beide Felder die gleiche Größe sicherstellen möchten, ist ein Indikator dafür, dass Sie für sie die gleiche Semantik haben, denke ich.
und dann ein Feld haben
in beiden Ihrer Typen.
quelle
C ++ - Lösung:
sizeof (Type :: member) scheint ebenfalls zu funktionieren:
quelle
@ Joey-Adams, danke! Ich habe das Gleiche gesucht, aber nach einem Array ohne Zeichen, und es funktioniert auch auf diese Weise einwandfrei:
Es wird wie erwartet 20 zurückgegeben.
Und @ brandon-horsley, das funktioniert auch gut:
quelle