【发布时间】:2018-11-29 07:35:15
【问题描述】:
我已经使用打包属性在 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)
如您所见,所有元素的大小必须为 16bits = 2Bytes,这在 GCC 中是正确的,但在 Visual Studio 中它返回 3Bytes!如果我将它的大小减小到 15 位,它将返回 2 字节。
我该如何解决?
【问题讨论】:
-
我每天都在 VS 上工作。关于位域,我曾经意识到,当基类型不同时,位域不会打包在一起。 IE。
struct Pack { unsigned a: 3; bool b: 1; };需要 2 个字节而不是预期的 1 个字节。这也可能是这里的问题。不幸的是,我不能说这方面的标准是什么。 -
你写 "如果我将它的大小减小到 15bits,它将返回 2Bytes":你如何减小它?请edit您的问题并添加相应的代码。同时告诉我们
enum_OPCode到底是什么。 -
你用的是哪个版本的VS?使用您的示例(和
enum enum_OPCode { OPCode1, OPCode2, OPCode3, OPCode4, OPCode5, OPCode6, NOPCodes };),我在 VS2013 中获得了 6 个字节(尝试了 Debug 和 Release )。将enum_OPCode替换为uint8_t,我仍然得到3。 -
不要使用位域或打包。位字段过于依赖于实现,并且打包只是非标准的。在这种情况下,将存储实现为单个 uint16_t,并为使用位移位和掩码实现的每个字段编写 getter 和 setter。
标签: c++ visual-studio gcc