gpt4 book ai didi

c++ - Visual Studio C++ 位域结构大小问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:12:07 24 4
gpt4 key购买 nike

我使用 packed 属性在 GCC 中创建并编译了以下代码,它按预期工作。但在 Visual Studio 中结果与 GCC 不同。

#pragma pack(push, 1)
typedef struct
{
uint8_t TargetID: 6;
enum_OPCode OPCode: 3;
uint8_t CRC7: 7;
} struct_commDataPack_request;
#pragma pack(pop)

如您所见,所有元素的大小必须为 16 位 = 2 字节,这在 GCC 中是正确的,但在 Visual Studio 中它返回 3 字节!如果我将它的大小减小到 15 位,它将返回 2 字节。

我该如何解决?

最佳答案

嗯,打包太依赖于平台了,不能真正依赖它。

在 VS 中,当您执行“pack(push, 1)”时,您实际上将填充设置为 8 位,并且如您所见,以三个字节结束(其中 6 位是填充)。

然而,GCC 上的填充(如果您使用 __attribute__((packed)) 或它的某个别名进行填充)可以完全关闭。这就是为什么您只看到 2 个字节的原因。

为了保持它的可移植性,你为什么不写你自己的小序列化程序呢?像这样:

struct_commDataPack_request s;
short wire = s.TargetID | (s.OPCode<<6) | (s.CRC7 << 9);

关于c++ - Visual Studio C++ 位域结构大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53533946/

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