Tuesday, 12 September 2017

sizeof single struct member in C




I am trying to declare a struct that is dependent upon another struct.
I want to use sizeof to be safe/pedantic.



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



Now I want to declare a struct child_t that has the same size as parent_t.text.



How can I do this? (Pseudo-code below.)



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

} child_t ;


I tried a few different ways with parent_t and struct _parent, but my compiler will not accept.



As a trick, this seems to work:



parent_t* dummy ;
typedef struct _child
{

char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;


Is it possible to declare child_t without the use of dummy?


Answer



Although defining the buffer size with a #define is one idiomatic way to do it, another would be to use a macro like this:




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


and use it like this:



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

} Parent;

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



I'm actually a bit surprised that sizeof((type *)0)->member) is even allowed as a constant expression. Cool stuff.


No comments:

Post a Comment

casting - Why wasn't Tobey Maguire in The Amazing Spider-Man? - Movies & TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...