gpt4 book ai didi

c++ - 在编译时根据字节顺序定义位域

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:19 24 4
gpt4 key购买 nike

假设我有以下 2 个基于 2 个字节的结构:

#pragma pack(1)
struct Foo {
unsigned short a : 5;
unsigned short b : 4;
unsigned short c : 2;
unsigned short d : 5;
} ;

struct Bar {
unsigned short a : 5;
unsigned short b : 4;
unsigned short c : 2;
unsigned short d : 3;
unsigned short e : 2;
} ;

我有一个包含它们的 union :

union Baz {
unsigned short val;
struct Foo foo;
struct Bar bar;
} ;

然后在我的程序中,我可以使用 val 放置一个值,并根据它们的位域获得 a、b、c、d 和 e 值,不需要按位操作/接口(interface)等。

但问题是,我需要它同时支持大字节序和小字节序,这意味着我需要让我的结构在编译时根据字节序定义位域。

因此,我需要这样的东西:

#pragma pack(1)
#if BIG_ENDIAN
struct Foo {
unsigned short a : 5;
unsigned short b : 4;
unsigned short c : 2;
unsigned short d : 5;
} ;

struct Bar {
unsigned short a : 5;
unsigned short b : 4;
unsigned short c : 2;
unsigned short d : 3;
unsigned short e : 2;
} ;

#else
struct Foo {
unsigned short d : 5;
unsigned short c : 2;
unsigned short b : 4;
unsigned short a : 5;
} ;

struct Bar {
unsigned short e : 2;
unsigned short d : 3;
unsigned short c : 2;
unsigned short b : 4;
unsigned short a : 5;
} ;
#endif

我试着查找它,但我能找到的只是运行时检查或只能在运行时使用的编译值。我知道有很多宏,如 BYTE_ORDER、LITTLE_ORDER、BIG_ORDER 等,但我无法确保它们将在请求的部署环境以及 endian.h 头文件中定义。另外,据我所知,boost 的 endian.hpp 正在实现我上面所说的关于宏的内容,所以我不确定它是否会产生任何影响。

有什么建议吗?


编辑1:回复其中一条评论:我需要一个 c++03 解决方案,但一个 c++11/14 解决方案也很适合启发。

最佳答案

这个问题对于一个简单的简短问题来说太长了:“我如何在编译时知道字节序。”,遗憾的是,这个问题的答案是“你不能”。

问题是,无论是 Posix 还是 C/C++ 标准都没有指定任何关于字节序的内容。您唯一可以做的就是测试已知的特定于体系结构的宏并从中派生 enddiannes。

关于c++ - 在编译时根据字节顺序定义位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33834701/

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