Saya mencoba mendeklarasikan struct yang bergantung pada struct lain. Saya ingin menggunakan sizeof
untuk menjadi aman / bertele-tele.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Sekarang saya ingin mendeklarasikan struct child_t
yang memiliki ukuran yang sama dengan parent_t.text
.
Bagaimana saya bisa melakukan ini? (Pseudo-code di bawah.)
typedef struct _child
{
char flag ;
char text[sizeof(parent_t.text)] ;
int used ;
} child_t ;
Saya mencoba beberapa cara berbeda dengan parent_t
dan struct _parent
, tetapi kompiler saya tidak mau menerimanya.
Sebagai trik, ini sepertinya berhasil:
parent_t* dummy ;
typedef struct _child
{
char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;
Apakah mungkin untuk mendeklarasikan child_t
tanpa menggunakan dummy
?
sizeof
tidak dievaluasi, jadi tidak ada masalah dengan dereferensi penunjuk null (karena sebenarnya tidak didereferensi).Saat ini saya tidak menggunakan mesin pengembangan, tetapi menurut saya Anda dapat melakukan salah satu dari yang berikut:
Edit : Saya suka makro member_size yang disarankan Joey menggunakan teknik ini, saya pikir saya akan menggunakannya.
sumber
Anda bebas menggunakan
FIELD_SIZEOF(t, f)
kernel Linux. Ini hanya didefinisikan sebagai berikut:Jenis makro ini disebutkan dalam jawaban lain. Tapi lebih portabel menggunakan makro yang sudah ditentukan.
sumber
Gunakan arahan preprocessor, yaitu #define:
sumber
drand48_data
(didefinisikan dalam stdlib.h) dan Anda menginginkan sizeof__x
. Anda tidak dapat#define X_LEN 3
dan mengubah stdlib.h, menggunakanmember_size
lebih baik jika Anda tidak memiliki akses ke sumber struct induk, yang tampaknya merupakan situasi yang masuk akal.Anda dapat menggunakan arahan preprocessor untuk ukuran sebagai:
dan menggunakannya untuk orang tua dan anak.
sumber
/usr/include/bits/dirent.h
ukurand_name
bidang (structdirect
/dirent
) tidak didefinisikanDIRSIZ
lagi tetapi di-hardcode; jadisizeof()
tampaknya satu-satunya cara yang bersih untuk menjaga ketergantunganstruct.h
apakah sudah ditentukan,jadi kamu bisa,
Namun, saat melihat di header, tampaknya ini adalah hal BSD dan bukan standar ANSI atau POSIX. Saya mencobanya di mesin Linux dan tidak berhasil; kegunaan terbatas.
sumber
Kemungkinan lain adalah menentukan tipe. Fakta bahwa Anda ingin memastikan ukuran yang sama untuk dua bidang adalah indikator bahwa Anda memiliki semantik yang sama untuk mereka, saya kira.
dan kemudian memiliki bidang
di kedua tipe Anda.
sumber
solusi c ++:
sizeof (Type :: member) tampaknya berfungsi dengan baik:
sumber
@ joey-adams, terima kasih! Saya mencari hal yang sama, tetapi untuk non char array dan itu berfungsi dengan baik bahkan dengan cara ini:
Ini mengembalikan 20 seperti yang diharapkan.
Dan, @ brandon-horsley, ini juga berfungsi dengan baik:
sumber