C/C++ 结构打包不起作用

2023-11-30

我正在尝试在 64-bit 32 位 Windows 上使用 g++ 来打包一个结构。

struct Foo
{
    uint8_t a;
    uint32_t b;
} __attribute__((packed));


int main(int argc, char *argv[])
{
    qDebug() << "sizeof(Foo):" << sizeof(Foo);
    return 0;
}

这输出 8。我尝试过的其他事情:

{ uint8_t a; } // Gives 1, correct.
{ uint8_t a; float b; } // Gives 8, expected 5.
{ uint8_t a; uint16_t b; } // Gives 4, expected 3.
{ uint16_t a; uint8_t b; uint8_t c; } // Gives 4, correct.

所以看起来结构已经被打包了,但是sizeof在某些情况下会四舍五入吗? (实际上,在写完这个问题后,我想我可以回答它,但无论如何我都会将其发布给后代。)

编辑:其实我不知道。我想aligned(1)会修复它,但它没有。


终于发现是g++ 中的一个错误.

普遍的问题是属性((__packed)) 仅适用 到结构体的最后一个字段。这就是 9 大小的原因。技巧是 这里是“#pragma pack(1)”。通过它你可以获得预期的尺寸。问题是 即使对于结构/联合的标记,也会应用此字段对齐 要打包(或通过 -fpack-struct 选项)。

好吧,这个解释似乎有些疑问,但解决方案有效 - 使用#pragma pack(1)而是像这样:

#pragma pack(1)

struct Foo
{
    uint8_t a;
    uint32_t b;
};

#pragma pack()

第二#pragma重置包值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++ 结构打包不起作用 的相关文章

随机推荐

  • 具有自动存储期限的变量的地址可以在其定义中取吗?

    是否允许在其定义的右侧获取对象的地址 如发生在foo below typedef struct char x 100 chars chars make void p printf p p n p chars c return c void
  • javascript 中 setInterval 函数的闭包

    如何使用setInterval不使用全局变量 我更喜欢将 setInerval 调用的函数的所有变量包装在某种闭包中 如下所示 var wrap function f var local1 local2 return function re
  • Jetpack 撰写 Canvas Arch 额外行程

    我在 jetpack compose 中使用画布来绘制由多个拱门形成的圆圈 为了让拱门看起来更好 我将帽子设置为圆形 style Stroke width chartBarWidth toPx cap StrokeCap Round The
  • Android Spinner:选择同一项目时不会调用 onItemSelected 侦听器

    我需要出示AlertDialog当选择第 2 项时Spinner 我知道使用onItemSelected我们可以聆听微调器的选择并显示弹出窗口 问题是当我选择第二个项目时 会出现对话框 但关闭对话框后 然后再次选择相同的项目 它不会将对话框
  • 在 Thymeleaf 中创建下拉菜单和表单

    我想创建一个下拉菜单 允许客户端通过下拉菜单中指定的字段搜索用户 例如 按州搜索 按城市搜索等 这是我到目前为止所拥有的 p Search options p
  • Swift 3 for 循环增量

    如何在 Swift3 中编写以下内容 for f first f lt last f interval n 1 这是我自己的尝试 for in 0 stride to last by interval n 1 斯威夫特 2 2 gt 3 0
  • 如何以编程方式暂停 NSTimer?

    我正在使用 NSTimer 在基于 OpenGL 的 iPhone 应用程序中进行一些渲染 我有一个弹出并请求用户输入的模式对话框 当用户提供输入时 我想 暂停 即如下所示 myNSTimer pause 我使用这种语法是因为我一直在做类似
  • MySQL / MariaDB 不接受 JSON 格式?无法创建数据库

    我目前在 phpmyadmin 上使用 XAMPP Apache 和 MariaDB 我正在尝试使用 Doctrine 创建一个基于我的代码的表 因此使用注释来验证表单 我只想将表单中输入的值存储在数据库中 在另一个例子中 这工作得很好 但
  • Tcpip 侦听器套接字 SSL 流如此混乱

    我正在尝试使用 NET 编写一个tcpip 服务器 查看此站点上的线程 普遍共识似乎是使用 NET 3 5 SocketArgs 类的某些变体来实现最大可扩展性 但我也必须使用 SSL 唯一的方法似乎是使用 tcplistener 然后从
  • 整数参数预期 int 在 opencv 中得到浮点数

    我已经显示了下面的代码 但是当我尝试执行它时 得到 Traceback most recent call last File home decentmakeover2 Code cv py line 22 in
  • Android:如何在活动(不是片段)之间滑动,主/细节最佳设置

    我正在开发一个 Android 应用程序 我对这一切都相当陌生 包括移动应用程序开发 所以我有几个问题 任何帮助都会很棒 1 是否可以在整个活动 包括操作栏 之间滑动 我的意思不是像 viewPager 在片段之间交换 我的意思是交换 整个
  • Azure 上的 Angular 2 应用程序读取应用程序设置

    我想使用 VSTS CI CD 将 Angular 2 应用程序部署到不同的 Web 应用程序插槽 例如开发 登台和生产 每个槽应该指向不同的 Web api 通常情况下 人们会在应用程序中指定三个不同的环境文件 但缺点是我必须使用不同的环
  • Angular2将类添加到body标签

    我怎样才能添加一个class to the body标签而不做body作为应用程序选择器并使用主机绑定 我尝试使用渲染器 但它改变了整个身体 Angular 2 x 在 body 标签上绑定类 我正在开发一个大型 angular2 应用程序
  • powershell调用restmethod多部分/表单数据

    我目前正在尝试使用 REST API 将文件上传到网络服务器 正如前面提到的 我正在使用 PowerShell 来实现此目的 使用curl 这没有问题 调用看起来像这样 curl H Auth token AUTH TOKEN H Cont
  • Kubernetes ConfigMap挂载单个文件而不是目录

    在 Kubernetes 中是否可以将 ConfigMap 中的文件挂载到已有其他文件的目录中 例如 基础镜像文件系统 app main main py test py ConfigMap 包含一个文件 Mounted py 该文件应与 m
  • 使用列值作为列名 mysql

    我正在尝试获取 5 公里半径内的所有用户 这是我的表结构 id location 1 26 851791 75 781810 2 26 860729 75 7633127 3 34 057811 84 239125 我编写一个查询来根据以下
  • 如何围绕 3D 轴 (Y) 旋转 2D UIElement?

    我有一个Grid对于一些内容 图像 文本 我想在 3D 空间中围绕 y 轴旋转它 某种动画倾斜效果 有没有像Rotate3DTransform这样的简单方法直接适用于Grid 使用 Viewport3D 如果您愿意使用 3D 模型和旋转 那
  • 从 EF 6.0 Beta 升级到 RC 后出现 System.MissingMethodException

    这是什么意思 用户代码未处理 System MissingMethodExceptionHResult 2146233069 消息 未找到方法 System Data Entity ModelConfiguration Configurat
  • 如何避免Fragment重玩?

    我有2个Fragments F1 and F2 我打开第一个Fragment F1来自Activity使用以下代码 MyFragment f1 new MyFragment Bundle bundle new Bundle bundle p
  • C/C++ 结构打包不起作用

    我正在尝试在 64 bit 32 位 Windows 上使用 g 来打包一个结构 struct Foo uint8 t a uint32 t b attribute packed int main int argc char argv qD