有没有可能找出C联合体的最小尺寸

有没有可能找出C联合体的最小尺寸,c,sizeof,unions,C,Sizeof,Unions,C联合的大小(sizeof())是其最大元素的大小 然而,有没有什么诀窍可以通过编程找出工会的最小规模 我的意思是如何实现宏的offsetof…我有两种方法来回答这个问题: 每个联合体只有一个大小,因此这也是它的最小大小 如果您真正想要的是组成并集的元素的最小大小,那么单独计算每个元素的大小并取其中的最小值 如果我理解正确,您希望在不声明该类型的变量和不引用成员类型的情况下查找联合类型的最小成员的大小。以下获得成员大小的技巧可能会奏效,但有点不可靠: #define membersize(typ

C联合的大小(sizeof())是其最大元素的大小

然而,有没有什么诀窍可以通过编程找出工会的最小规模


我的意思是如何实现宏的offsetof…

我有两种方法来回答这个问题:

  • 每个联合体只有一个大小,因此这也是它的最小大小
  • 如果您真正想要的是组成并集的元素的最小大小,那么单独计算每个元素的大小并取其中的最小值

  • 如果我理解正确,您希望在不声明该类型的变量和不引用成员类型的情况下查找联合类型的最小成员的大小。以下获得成员大小的技巧可能会奏效,但有点不可靠:

    #define membersize(type, member) sizeof(((type *)0)->member)
    
    您必须单独计算每个成员的大小,以确定哪个成员最小,因此,如果有人向联盟中添加了新成员,您必须更改确定最小成员大小的代码以说明原因。

    仅作为练习:

  • 为工会成员使用特定模式
  • 每次更新联合时都要注意更新代码 成员
  • 使用变量跟踪每个成员的结尾
  • 你可以像下面这样做

    #include <stdio.h>
    #include <stdint.h>
    #include <stddef.h>
    #include <inttypes.h>
    
    struct s1
    {
        uint8_t member;
        uint8_t len;
    };
    
    struct s2
    {
        uint16_t member;
        uint8_t len;
    };
    
    struct s3
    {
        uint32_t member;
        uint8_t len;
    };
    
    typedef union u1
    {
        struct s1 m1;
        struct s2 m2;
        struct s3 m3;
    }UNION_TEST;
    
    #define RETRIEVE_MEMBER(memberNum) m##memberNum
    #define test(unionName, memberName) offsetof(unionName, memberName.len)+sizeof(uint8_t)
    
    int main(void)
    {
       printf("sizeof = %zu\n", test(UNION_TEST, RETRIEVE_MEMBER(1)));
       printf("sizeof = %zu\n", test(UNION_TEST, RETRIEVE_MEMBER(2)));
       printf("sizeof = %zu\n", test(UNION_TEST, RETRIEVE_MEMBER(3)));
    }
    
    #包括
    #包括
    #包括
    #包括
    结构s1
    {
    uint8成员;
    uint8_t len;
    };
    结构s2
    {
    uint16成员;
    uint8_t len;
    };
    结构s3
    {
    uint32成员;
    uint8_t len;
    };
    类型定义联合u1
    {
    结构s1m1;
    结构s2 m2;
    结构s3m3;
    }联合检验;
    #定义RETRIEVE_MEMBER(memberNum)m##memberNum
    #定义测试(unionName,memberName)偏移量(unionName,memberName.len)+sizeof(uint8\t)
    内部主(空)
    {
    printf(“sizeof=%zu\n”,测试(联合测试,检索成员(1));
    printf(“sizeof=%zu\n”,测试(联合测试,检索成员(2));
    printf(“sizeof=%zu\n”,测试(联合测试,检索成员(3));
    }
    
    联合的大小不随当前持有值的成员而变化。它总是足够大以容纳最大的成员,并且它可以更大。你到底想实现什么?我不确定你的开场白一定是真的。也许专家能证实吗?@Bathsheba;这就是为联合分配内存的方式。@haccks Re“C联合的大小(sizeof())是其最大元素的大小”:严格来说,对于奇数最大元素大小,如果没有编译器的打包指令,则该大小将更大。哦,John已经说过了,我现在明白了……”“C联合体(sizeof())的大小至少是其最大元素的大小,而且通常更大。”(为您修复了它)我不明白,如果您已经知道类型,为什么不简单地使用
    sizeof(type)
    ?不,这不是一个好把戏<代码>神秘的宏(结构类型,成员名称)比
    sizeof(((结构类型*)0)->成员名称)
    糟糕得多。“请不要试图重新发明C语言,用某种神秘的宏语言来代替它。@Lundin,但这样你就得到了
    sizeof
    的指针,而不是类型的大小,不是吗?”AlterMann编辑了评论。无论如何,这两种方法都是毫无意义的。也许一个复合文字就不那么难看了。@Lundin,OP想要一些“关于offsetof宏是如何实现的”东西,所以我用了一个宏。你在用火箭筒杀死苍蝇:)。。。如果在中使用这些结构,则会浪费空间arrays@AlterMann当前位置D.正如我所写:我这样做是为了锻炼。我知道,这是一个笑话:D@chux是返回值大小的偏移量?@chux Thx。编辑。