我正在尝试将数据打包到c ++结构中。
我的结构有这样的布局:
struct structName
{
int16_t member1;
int32_t member2;
uint32_t member3;
uint32_t member4;
uint32_t member5;
etc
}__attribute__((packed));
使用offsetof($structname, $membername)
我得到了正确的数据偏移量(0,2,6,10,14 ...),但是当我按成员名访问数据时,我得到4字节的数据偏移量(0,4,8,12,16 ...)就好像结构没有打包一样。
时
} __attribute__((packed));
构建一个struct的正确方法? 。
答案 0 :(得分:6)
更新: mydogisbox 写道:
对于记录,
__attribute__((packed))
,#pramga pack(1)
和#pragma pack(push, 1)
都有效。
__attribute__((packed))
是 gcc 扩展程序,受支持。
clang文档说它还支持#pragma pack(...)
指令:
clang对微软的扩展有一些实验性的支持 Visual C ++;要启用它,请使用-fms-extensions命令行选项。 这是Windows目标的默认设置。请注意,支持是 不完整的;启用Microsoft扩展将默默地删除 构造(包括__declspec和Microsoft样式的asm语句)。
clang支持用于控制记录布局的Microsoft
#pragma pack
功能。
来源:http://clang.llvm.org/docs/UsersManual.html
请说:
#pragma pack(1)
struct my_struct {
int16_t x;
// etc.
};
查看它是否有效(如果不使用Windows,则使用-fms-extensions
进行编译)。
请注意,以上都是非标准扩展,新的C ++ 11标准有一个新的alignas
关键字:http://en.cppreference.com/w/cpp/language/alignas
struct alignas(1) my_struct {
int16_t x;
// etc.
};
但它的支持仍然有点粗略。