【发布时间】:2019-09-02 04:58:47
【问题描述】:
我想根据机器的字节序在结构中定义变量,这是我尝试过的
#define IS_BIG_ENDIAN (!(union { uint16_t u16; unsigned char c; }){ .u16 = 1 }.c)
//#define IS_BIG_ENDIAN (!*(unsigned char *)&(uint16_t){1})
struct A {
#if IS_BIG_ENDIAN
char a:4;
char b:4;
#else
char b:4;
char a:4;
#endif
}
以上代码报错,是否可以实现。我的主要目标是实现结构变量的逆序。
【问题讨论】:
-
另外,请注意位域的布局是实现定义的[class.bit]/1。所以请注意,这本质上不是一种可移植的做事方式……
-
Byte order fallacy tldr;机器的字节顺序无关紧要重要的是数据的字节顺序
-
通过联合的类型双关语通常是 UB,我不知道
char或char[]有一个例外(与指针一样,所有这些都可以合法地转换为char*...) -
你为什么要那个?您想通过按原样打印结构的字节来进行序列化吗?这在其他方面也很危险——例如。 G。对齐:
struct S { int32_t i32; int64_t i64; };在 32 位编译器上的大小可能为 12,但在 64 位编译器上为 16,因为两个成员之间存在字节填充!
标签: c++ c++11 endianness