sizeof single struct member in C

后端 未结 9 2074
礼貌的吻别
礼貌的吻别 2020-11-30 17:13

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
{
  floa         


        
相关标签:
9条回答
  • 2020-11-30 17:42

    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.

    0 讨论(0)
  • 2020-11-30 17:49

    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.

    0 讨论(0)
  • 2020-11-30 17:51

    Another possibility would be to define a type. The fact that you want to ensure the same size for the two fields is an indicator that you have the same semantics for them, I think.

    typedef char description[255];
    

    and then have a field

    description text;
    

    in both of your types.

    0 讨论(0)
  • 2020-11-30 17:52

    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.

    0 讨论(0)
  • 2020-11-30 18:02

    You can use a preprocessor directive for size as:

    #define TEXT_MAX_SIZE 255
    

    and use it in both parent and child.

    0 讨论(0)
  • 2020-11-30 18:02

    struct.h has them already defined,

    #define fldsiz(name, field) \
        (sizeof(((struct name *)0)->field))
    

    so you could,

    #include <stdlib.h> /* EXIT_SUCCESS */
    #include <stdio.h>  /* printf */
    #include <struct.h> /* fldsiz */
    
    struct Penguin {
        char name[128];
        struct Penguin *child[16];
    };
    static const int name_size  = fldsiz(Penguin, name) / sizeof(char);
    static const int child_size = fldsiz(Penguin, child) / sizeof(struct Penguin *);
    
    int main(void) {
        printf("Penguin.name is %d chars and Penguin.child is %d Penguin *.\n",
               name_size, child_size);
        return EXIT_SUCCESS;
    }
    

    but, on looking in the header, it appears that this is a BSD thing and not ANSI or POSIX standard. I tried it on a Linux machine and it didn't work; limited usefulness.

    0 讨论(0)
提交回复
热议问题