联合定义中的 `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
}

目前阅读:union, struct

您可以给 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;