Estoy tratando de declarar una estructura que depende de otra estructura. Quiero usar sizeof
para ser seguro / pedante.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Ahora quiero declarar una estructura child_t
que tenga el mismo tamaño que parent_t.text
.
¿Cómo puedo hacer esto? (Pseudocódigo a continuación).
typedef struct _child
{
char flag ;
char text[sizeof(parent_t.text)] ;
int used ;
} child_t ;
Intenté algunas formas diferentes con parent_t
y struct _parent
, pero mi compilador no acepta.
Como truco, esto parece funcionar:
parent_t* dummy ;
typedef struct _child
{
char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;
¿Es posible declarar child_t
sin el uso de dummy
?
sizeof
no se evalúa, por lo que no hay problema con desreferenciar el puntero nulo (porque en realidad no está desreferenciado).No estoy en mi máquina de desarrollo en este momento, pero creo que puede hacer una de las siguientes cosas:
Editar : Me gusta la macro member_size que Joey sugirió usar esta técnica, creo que la usaría.
fuente
Puede utilizarlo
FIELD_SIZEOF(t, f)
en el kernel de Linux. Simplemente se define de la siguiente manera:Este tipo de macro se menciona en otras respuestas. Pero es más portátil usar una macro ya definida.
fuente
Utilice una directiva de preprocesador, es decir, #define:
fuente
drand48_data
(definida en stdlib.h) y desea el tamaño de__x
. no puede#define X_LEN 3
y cambiar stdlib.h, usarmember_size
es superior cuando no tiene acceso a la fuente de la estructura principal, lo que parece una situación razonable.Puede utilizar una directiva de preprocesador para el tamaño como:
y utilícelo tanto en padres como en niños.
fuente
/usr/include/bits/dirent.h
el tamaño deld_name
campo (structdirect
/dirent
) ya no está definido comoDIRSIZ
sino codificado; así quesizeof()
parece ser la única forma limpia de mantener la dependenciastruct.h
los tiene ya definidos,para que pudieras
pero, al mirar en el encabezado, parece que esto es una cosa BSD y no un estándar ANSI o POSIX. Lo probé en una máquina Linux y no funcionó; utilidad limitada.
fuente
Otra posibilidad sería definir un tipo. El hecho de que desee garantizar el mismo tamaño para los dos campos es un indicador de que tiene la misma semántica para ellos, creo.
y luego tener un campo
en ambos tipos.
fuente
solución c ++:
sizeof (Type :: member) parece estar funcionando también:
fuente
@ joey-adams, ¡gracias! Estaba buscando lo mismo, pero para una matriz sin caracteres y funciona perfectamente bien incluso de esta manera:
Devuelve 20 como se esperaba.
Y, @ brandon-horsley, esto también funciona bien:
fuente