调整C中结构的字节数组类型修剪大小的正确方法

时间:2018-11-03 00:48:19

标签: c

假设我有这个定义:

struct A {
    union {
        struct {
             T1 f1;
             T2 f2;
             T3 f3;
             ...
        };
        char bytes[...];
};

在标准C(或据我所知在某种程度上允许并入类型联合的gnu-c ++ 14)中,有一种方法可以自动将bytes数组的大小设置为与与union一起使用的未命名结构?

1 个答案:

答案 0 :(得分:2)

要匹配匿名结构的大小,它必须不是匿名的,但是在标准C中,您不能透明地寻址其成员。

typedef int T1,T2,T3; //example types
struct name{ //originally anonymous struct given a name
     T1 f1;
     T2 f2;
     T3 f3;
};
struct A{
    union {
        struct name embedded;
        char bytes[sizeof(struct name)];
        //^can size it now that is has a name
    } ;
}u;

在扩展C(带有gcc的-fms-extensions / -fplan9-extensions)下,您可以执行以下操作:

typedef int T1,T2,T3;
struct name{
     T1 f1;
     T2 f2;
     T3 f3;
};
struct A{
    union {
        struct name; //embed struct name transparently
        char bytes[sizeof(struct name)];
    } ;
}u;

但是在任何情况下,这都不是必需的,因为C标准明确允许您将任何对象重新解释为char数组,而不会引起任何未定义的行为(只需将指向该对象的指针转换为char*并假装您正在读取char数组)。

编辑:如果您需要通过char以外的其他类型进行重新解释,则可以使用如下宏:

typedef int T1,T2,T3;
#define ANON_STRUCT \
    struct { \
         T1 f1; \
         T2 f2; \
         T3 f3; \
    }
struct A{
    union {
        ANON_STRUCT;
        ANON_STRUCT named_anon;
        #if __cplusplus
        char bytes[sizeof(named_anon)];
        #else
        char bytes[sizeof(ANON_STRUCT)];
        #endif
    } ;
}u;

但是上次我检查您不能在C ++中使用联合进行重新解释(仅在C中),您必须坚持使用当前处于活动状态的成员。