sizeof single struct member in C
Solution 1:
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.
Solution 2:
I am not on my development machine right now, but I think you can do one of the following:
sizeof(((parent_t *)0)->text)
sizeof(((parent_t){0}).text)
Edit: I like the member_size macro Joey suggested using this technique, I think I would use that.
Solution 3:
You are free to use FIELD_SIZEOF(t, f)
in the Linux kernel.
It's just defined as following:
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
This type of macro is mentioned in other answers. But it's more portable to use an already-defined macro.
Solution 4:
Use a preprocessor directive, i.e. #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 ;
Solution 5:
You can use a preprocessor directive for size as:
#define TEXT_MAX_SIZE 255
and use it in both parent and child.