J'essaye de déclarer une structure qui dépend d'une autre structure. Je veux utiliser sizeof
pour être sûr / pédant.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Maintenant, je veux déclarer une structure child_t
qui a la même taille que parent_t.text
.
Comment puis-je faire ceci? (Pseudo-code ci-dessous.)
typedef struct _child
{
char flag ;
char text[sizeof(parent_t.text)] ;
int used ;
} child_t ;
J'ai essayé différentes méthodes avec parent_t
et struct _parent
, mais mon compilateur n'acceptera pas.
En guise d'astuce, cela semble fonctionner:
parent_t* dummy ;
typedef struct _child
{
char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;
Est-il possible de déclarer child_t
sans utiliser de dummy
?
sizeof
n'est pas évalué, il n'y a donc aucun problème avec le déréférencement du pointeur nul (car il n'est pas réellement déréférencé).Je ne suis pas sur ma machine de développement pour le moment, mais je pense que vous pouvez effectuer l'une des opérations suivantes:
Edit : J'aime la macro member_size que Joey a suggérée en utilisant cette technique, je pense que je l'utiliserais.
la source
Vous êtes libre d'utiliser
FIELD_SIZEOF(t, f)
dans le noyau Linux. Il est simplement défini comme suit:Ce type de macro est mentionné dans d'autres réponses. Mais il est plus portable d'utiliser une macro déjà définie.
la source
Utilisez une directive de préprocesseur, c'est-à-dire #define:
la source
drand48_data
(définie dans stdlib.h) et que vous vouliez la taille de__x
. vous ne pouvez pas#define X_LEN 3
et changez le stdlib.h, l'utilisationmember_size
est supérieure lorsque vous n'avez pas accès à la source de la structure parent, ce qui semble être une situation raisonnable.Vous pouvez utiliser une directive de préprocesseur pour la taille comme:
et utilisez-le à la fois chez le parent et l'enfant.
la source
/usr/include/bits/dirent.h
la taille dud_name
champ (structdirect
/dirent
) n'est plus définie comme étantDIRSIZ
codée en dur; doncsizeof()
semble être la seule façon de garder propre la dépendancestruct.h
les a déjà définis,pour que tu puisses,
mais, en regardant dans l'en-tête, il semble que ce soit une chose BSD et non ANSI ou POSIX standard. Je l'ai essayé sur une machine Linux et cela n'a pas fonctionné; utilité limitée.
la source
Une autre possibilité serait de définir un type. Le fait que vous vouliez assurer la même taille pour les deux champs est un indicateur que vous avez la même sémantique pour eux, je pense.
puis avoir un champ
dans vos deux types.
la source
solution c ++:
sizeof (Type :: member) semble également fonctionner:
la source
@ joey-adams, merci! Je cherchais la même chose, mais pour un tableau non char et cela fonctionne parfaitement bien même de cette façon:
Il renvoie 20 comme prévu.
Et, @ brandon-horsley, cela fonctionne bien aussi:
la source