是否有可能使联合在 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;
例如,并集的默认对齐方式如下:
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;