1

我正在尝试将数据打包到 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));

使结构打包的正确方法?. .

4

1 回答 1

6

更新:mydogisbox写道:

为了记录,__attribute__((packed))#pramga pack(1)所有#pragma pack(push, 1)工作。

__attribute__((packed))是一个gcc扩展,它是受支持的。

clang 文档说它还支持#pragma pack(...)指令:

clang 对 Microsoft 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.
};

看看它是否有效(-fms-extensions如果不使用 Windows 则编译)。

注意以上都是非标准扩展,新的C++11标准有一个新的alignas关键字:http ://en.cppreference.com/w/cpp/language/alignas

struct alignas(1) my_struct {
    int16_t x;
    // etc.
};

但它的支持仍然有点粗略。

于 2012-06-04T21:50:24.633 回答