138 votes

C: sizeof unique struct membre

Je suis en train 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 (struct) child_t qui a la même taille que parent_t.text.

Comment puis-je faire cela? (Pseudo-code ci-dessous.)

typedef struct _child
{
  char flag ;
  char text[sizeof(parent_t.text)] ;
  int used ;
} child_t ;

J'ai essayé un peu de différentes manières avec des parent_t et struct _parent, mais mon compilateur ne seront pas accepter.

Comme une 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 l'utilisation d' dummy?

Merci.

250voto

Joey Adams Points 13049

Bien que la définition de la taille de la mémoire tampon avec un #define est un idiomatiques façon de le faire, une autre serait d'utiliser une macro comme ceci:

#define member_size(type, member) sizeof(((type *)0)->member)

et de l'utiliser comme ceci:

typedef struct
{
    float calc;
    char text[255];
    int used;
} Parent;

typedef struct
{
    char flag;
    char text[member_size(Parent, text)];
    int used;
} Child;

En fait, je suis un peu surpris de voir que sizeof((type *)0)->member) est même permis une expression constante. Des trucs Cool.

45voto

Brandon Horsley Points 4001

Je ne suis pas sur ma machine de développement pour l'instant, mais je pense que vous pouvez effectuer l'une des opérations suivantes:

sizeof(((parent_t *)0)->text)

sizeof(((parent_t){0}).text)


Modifier

: J'aime la member_size macro Joey a suggéré d'utiliser cette technique, je pense que je voudrais utiliser.

11voto

dave mankoff Points 3837

Utiliser une directive de préprocesseur, c'est à dire #define:

#define TEXT_LEN 255

typedef struct _parent
{
  float calc ;
  char text[TEXT_LEN] ;
  int used ;
} parent_t ;

typedef struct _child
{
  char flag ;
  char text[TEXT_LEN] ;
  int used ;
} child_t ;

5voto

codaddict Points 154968

Vous pouvez utiliser une directive de préprocesseur pour la taille:

#define TEXT_MAX_SIZE 255

et de l'utiliser à la fois le parent et l'enfant.

4voto

Jens Gustedt Points 40410

Une autre possibilité serait de définir un type. Le fait que vous voulez vous assurer de la même taille pour les deux champs est un indicateur que vous avez la même sémantique pour eux, je pense.

typedef char description[255];

et puis avoir un champ

description text;

dans les deux types.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X