Próbuję zadeklarować strukturę, która jest zależna od innej struktury. Chcę sizeof
być bezpieczny / pedantyczny.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Teraz chcę zadeklarować strukturę, child_t
która ma taki sam rozmiar jak parent_t.text
.
W jaki sposób mogę to zrobić? (Pseudokod poniżej).
typedef struct _child
{
char flag ;
char text[sizeof(parent_t.text)] ;
int used ;
} child_t ;
Próbowałem na kilka różnych sposobów z parent_t
i struct _parent
, ale mój kompilator nie akceptuje.
Wydaje się, że to działa:
parent_t* dummy ;
typedef struct _child
{
char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;
Czy można złożyć deklarację child_t
bez użycia dummy
?
sizeof
nie jest oceniany, więc nie ma problemu z wyłuskiwaniem wskaźnika pustego (ponieważ w rzeczywistości nie jest on wyłuskiwany).Nie jestem teraz na moim komputerze deweloperskim, ale myślę, że możesz wykonać jedną z następujących czynności:
Edycja : Podoba mi się makro member_size, który Joey zasugerował użycie tej techniki, myślę, że użyłbym tego.
źródło
Możesz swobodnie używać
FIELD_SIZEOF(t, f)
w jądrze Linuksa. Jest zdefiniowany w następujący sposób:Ten typ makra jest wymieniany w innych odpowiedziach. Ale bardziej przenośne jest użycie już zdefiniowanego makra.
źródło
Użyj dyrektywy preprocesora, tj. #Define:
źródło
drand48_data
(zdefiniowana w stdlib.h) i chcesz, aby rozmiar sizeof__x
. nie możesz#define X_LEN 3
i zmienić stdlib.h, używaniemember_size
jest lepsze, gdy nie masz dostępu do źródła struktury macierzystej, co wydaje się rozsądną sytuacją.Możesz użyć dyrektywy preprocesora dla rozmiaru jako:
i używaj go zarówno u rodzica, jak i dziecka.
źródło
/usr/include/bits/dirent.h
rozmiard_name
pola (structdirect
/dirent
) nie jest już zdefiniowany jakoDIRSIZ
już zakodowany; więcsizeof()
wydaje się być jedynym czystym sposobem na utrzymanie zależnościstruct.h
ma je już zdefiniowane,więc mógłbyś
ale patrząc w nagłówek, okazuje się, że jest to sprawa BSD, a nie standard ANSI czy POSIX. Wypróbowałem to na komputerze z Linuksem i nie działało; ograniczona przydatność.
źródło
Inną możliwością byłoby zdefiniowanie typu. Fakt, że chcesz zapewnić ten sam rozmiar dla dwóch pól, jest wskaźnikiem, że masz dla nich taką samą semantykę, jak sądzę.
a potem mieć pole
w obu twoich typach.
źródło
rozwiązanie C ++:
Wygląda na to, że sizeof (Type :: member) również działa:
źródło
@ joey-adams, dziękuję! Szukałem tego samego, ale dla tablicy non char i działa doskonale nawet w ten sposób:
Zwraca 20 zgodnie z oczekiwaniami.
@ Brandon-horsley, to też działa dobrze:
źródło