假设我有这个定义:
struct A {
union {
struct {
T1 f1;
T2 f2;
T3 f3;
...
};
char bytes[...];
};
在标准C(或据我所知在某种程度上允许并入类型联合的gnu-c ++ 14)中,有一种方法可以自动将bytes
数组的大小设置为与与union
一起使用的未命名结构?
答案 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中),您必须坚持使用当前处于活动状态的成员。