根据计算机的字节序定义宏
Define macros based on endianness of machine
我想根据机器的字节序在结构中定义变量,这是我尝试过的
#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
}
上面的代码给出了错误,这是可以实现的吗?我的主要目标是实现结构变量的相反顺序。
来自 https://sourceforge.net/p/predef/wiki/Endianness/
你没有标准的方式来拥有它。
但自定义标头<sys/param.h>
或<endian.h>
可能会提供宏,例如:
Type Macro Value
Big endian __BYTE_ORDER __BIG_ENDIAN
Little endian __BYTE_ORDER __LITTLE_ENDIAN
Little endian (word-swapped) __BYTE_ORDER __PDP_ENDIAN
该测试不适用于预处理器 if 指令。
即将到来的 C++20 建议有std::endian
.它可以在没有预处理器的情况下使用。
static_assert(std::endian::native == std::endian::big
|| std::endian::native == std::endian::little);
struct ABig {
char a:4;
char b:4;
};
struct ALit {
char b:4;
char a:4;
};
using A = std::conditional_t<std::endian::native == std::endian::big, ABig, ALit>;
在 C++20 之前,没有获得字节序的标准方法。
便携式解决方案是使用预定义的宏来检测系统。有些系统是小端序(Windows),而另一些系统则提供带有宏定义的标头(Linux中的<endian.h>
,BSD中的<sys/endian.h>
等),而其他系统可能在其他方面有所不同。GCC 编译器提供宏:
__BYTE_ORDER__
__ORDER_LITTLE_ENDIAN__
__ORDER_BIG_ENDIAN__
__ORDER_PDP_ENDIAN__
也就是说,位字段表示的几乎每个方面都是实现定义的,如果顺序精确很重要 - 因为它看起来是 - 那么你无论如何都将不得不依赖特定的实现,所以可移植性是无法实现的。确定您的目标系统,一旦您决定,请查阅该系统的文档,了解如何获取字节序。
最好不要依赖位字段的表示形式。
等到 C++20(或使用编译器的实验功能),您将能够使用C++标准 std::endian 来实现这一点:
指示所有标量类型的字节序:
如果所有标量类型都是小端序,则 std::endian::native 等于 std::endian::little 如果所有标量类型都是大端序, std::endian::native equals std::endian::big
谢谢@Jarod42,以下代码对我有用
#define IS_BIG_ENDIAN (__BYTE_ORDER__ == __BIG_ENDIAN)
struct A {
#if IS_BIG_ENDIAN
char a:4;
char b:4;
#else
char b:4;
char a:4;
#endif
};
- 在提升multi_index容器中,是否定义了"default index"?
- 从不同线程使用int64的不同字节安全吗
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- 交换未定义数据类型中的字节顺序
- 当 NUL 字符被定义为字符串的一部分时,为什么 strlen() 不计算终止 NUL 字符的字节?
- rpcndr 和 cstddef 中的不明确字节定义
- 如何定义等于 16 字节的类型
- 根据计算机的字节序定义宏
- 为什么在未由语言本身定义的结构字节中的位字段顺序
- 在自定义 C/C++ 程序中获取 PPP0 接口 Tx/Rx 字节的最简单方法是什么?
- 如何使用 boost 从 com 端口读取未定义的字节数
- 如何创建自定义字节级数据类型
- 联合类型定义中的冗余字节
- 将16字节CAS与GCC一起使用时出现未定义的引用链接器错误
- 在编译时根据字节序定义位字段
- 将unicode字符串定义为字节数组
- 重载运算符<<(无符号字符类型定义作为字节)
- std::wstring 的标准定义字节序是什么?