是否有可能使联合在 C 中右对齐?

Is it possible to make a union right aligned in C?

例如,并集的默认对齐方式如下:

union{
   uint32_t v4;
   __uint128_t v6;
}ip;

//in memory
//aaaa
//bbbbbbbbbbbbbbbb

但我想让联合右对齐:

//            aaaa
//bbbbbbbbbbbbbbbb

是否可以在 C 中实现?

你可以定义

union{
   struct {
     char uselessgap[12];
     uint32_t v4;
   } s;
   __uint128_t v6;
}ip;

然后在您的 C 代码中使用 s.v4 而不是 v4;你甚至可以

#define v4 s.v4

我不确定(那个宏)是个好主意。

另一种方法是使用您的 GCC plugin (for a particular version of the GCC 编译器)和一些 __attribute__ 由它处理。

您可以为此使用 C11 匿名结构。

union {
#pragma pack(1)
    struct {
        char padding_[sizeof(__uint128_t) - sizeof(uint32_t)];
        uint32_t v4;
    };
#pragma pack(0)
    __uint128_t v6;
} ip;

// usage
ip.v4 = 0x7F000000;