联合定义中的 `sizeof` 结构
`sizeof` struct in union definition
要按字节访问 struct
,我使用的是 union
。
typedef struct {
char hi;
char lo;
} range;
union {
range by_name;
char as_bytes[sizeof(range)];
} U1;
char use_U1(void){
char c = U1.as_bytes[0];
return U1.by_name.hi;
}
问题一:是否可以跳过typedef
?像这样:
union {
struct {
char hi;
char lo;
} by_name;
char as_bytes[2]; //want sizeof()
} U2;
天真的char as_bytes[sizeof(by_name)]
无法编译:
错误:'by_name' 未在此处声明(不在函数中)
问题2:同上但采用匿名结构,避免在使用时输入.by_name
。
union {
struct {
char hi;
char lo;
};
char as_bytes[2]; //want sizeof()
} U3;
int use_U3(void){
char c = U3.as_bytes[0];
return U3.hi; // anonymous structure
}
您可以给 struct
一个标签名称并使用它。
union {
struct inner {
char hi;
char lo;
} by_name;
char as_bytes[sizeof(struct inner)];
} U2;
请注意,这确实要求内部结构有一个名称。如果没有名称,则必须省略标签。
您不能采用匿名类型的大小,因此只需使其不匿名即可:
union
{
struct range// <<< give it a tag here
{
char hi;
char lo;
} by_name;
char as_bytes[sizeof(struct range)]; // <<< Take sizeof here
} U2;
您也可以创建一个嵌套的 typedef,尽管它可能没有什么用处:
union
{
typedef struct
{
char hi;
char lo;
} range ;
range by_name;
char as_bytes[sizeof(range)];
} U2;
更简单的版本不可移植(如果您打算使用非 gcc 或 msvc 编译器):
union {
struct{
char hi;
char lo;
};
char as_bytes[0];
} U2;
要按字节访问 struct
,我使用的是 union
。
typedef struct {
char hi;
char lo;
} range;
union {
range by_name;
char as_bytes[sizeof(range)];
} U1;
char use_U1(void){
char c = U1.as_bytes[0];
return U1.by_name.hi;
}
问题一:是否可以跳过typedef
?像这样:
union {
struct {
char hi;
char lo;
} by_name;
char as_bytes[2]; //want sizeof()
} U2;
天真的char as_bytes[sizeof(by_name)]
无法编译:
错误:'by_name' 未在此处声明(不在函数中)
问题2:同上但采用匿名结构,避免在使用时输入.by_name
。
union {
struct {
char hi;
char lo;
};
char as_bytes[2]; //want sizeof()
} U3;
int use_U3(void){
char c = U3.as_bytes[0];
return U3.hi; // anonymous structure
}
您可以给 struct
一个标签名称并使用它。
union {
struct inner {
char hi;
char lo;
} by_name;
char as_bytes[sizeof(struct inner)];
} U2;
请注意,这确实要求内部结构有一个名称。如果没有名称,则必须省略标签。
您不能采用匿名类型的大小,因此只需使其不匿名即可:
union
{
struct range// <<< give it a tag here
{
char hi;
char lo;
} by_name;
char as_bytes[sizeof(struct range)]; // <<< Take sizeof here
} U2;
您也可以创建一个嵌套的 typedef,尽管它可能没有什么用处:
union
{
typedef struct
{
char hi;
char lo;
} range ;
range by_name;
char as_bytes[sizeof(range)];
} U2;
更简单的版本不可移植(如果您打算使用非 gcc 或 msvc 编译器):
union {
struct{
char hi;
char lo;
};
char as_bytes[0];
} U2;