gpt4 book ai didi

c++ - gcc 中的位域字节顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:58 26 4
gpt4 key购买 nike

位域的字节顺序是实现定义的。有没有办法在编译时通过某些宏或其他编译器标志检查 gcc 的位域字节序实际上是什么?

换句话说,给定如下内容:

struct X {
uint32_t a : 8;
uint32_t b : 24;
};

有没有办法让我在编译时知道 aX 中的第一个字节还是最后一个字节?

最佳答案

在 Linux 系统上,您可以检查 __BYTE_ORDER 宏以查看它是 __LITTLE_ENDIAN 还是 __BIG_ENDIAN。虽然这不是权威的,但在实践中它应该有效。

在 netinet/ip.h 中 struct iphdr 的定义中,这是一个正确的方法,它用于 IP header 。第一个字节包含两个以位域形式实现的 4 位域,因此顺序很重要:

struct iphdr
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ihl:4;
unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
unsigned int version:4;
unsigned int ihl:4;
#else
# error "Please fix <bits/endian.h>"
#endif
u_int8_t tos;
u_int16_t tot_len;
u_int16_t id;
u_int16_t frag_off;
u_int8_t ttl;
u_int8_t protocol;
u_int16_t check;
u_int32_t saddr;
u_int32_t daddr;
/*The options start here. */
};

关于c++ - gcc 中的位域字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47600584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com