gpt4 book ai didi

c - 定义 C 结构体的打包版本

转载 作者:行者123 更新时间:2023-12-02 03:32:59 24 4
gpt4 key购买 nike

我在代码之外的某处定义了一个 C 结构。我可以定义相同结构的打包版本吗?如果我从一开始就定义自己的结构,那就很容易了:

struct test {
// members
} __attribute__((packed));

我定义了一个简单的结构并尝试了两种可能性,即:
struct test {
int x;
double y;
char z;
};

struct test_p {
struct test __attribute__((packed)) s;
};

还有这个:
struct test {
int x;
double y;
char z;
};

struct test_p {
struct test p;
} __attribute__((packed));

但是,这些工作(虽然都编译得很好)在我的系统上打印 sizeof(struct test_p)=24(我在 64 位机器上使用 gcc 4.8.2)与 sizeof(struct test) 相同。有没有办法达到想要的效果?

以防万一您想知道:我想解析通过网络收到的数据包,这些数据包只是打包结构。问题是,我无法修改头文件,因为它是第三方库的一部分,而且结构本身包含的字段太多,无法一一复制。我当然可以将结构定义复制到我自己的标题并制作打包版本——实际上这是我现在使用的解决方案——但我只是想知道是否有一个更简洁的解决方案,不涉及复制整个定义.

最佳答案

gcc 引入了 __attribute__((packed))正是为了避免您正在寻求的危险影响:结构的定义应该在所有使用相同定义的用户应用程序和库之间二进制兼容。

但是 gcc 也提供了一种打包方式 the old fashioned, dangerous way - #pragma pack(push,n)#pragma pack(pop) .仅当第 3 方头文件仅包含结构定义,或者您不使用头文件中的任何其他内容时,它才会可靠地工作。像这样使用它们:

#pragma pack(push,1)
#include "theheader.h"
#pragma pack(pop)

否则,我个人会简单地复制粘贴结构定义,重命名它,然后添加 __attribute__((packed))在我自己的标题中。用编译指示打包整个标题真的是一个肮脏的黑客。并且 3rd 方 header 可能会以意想不到的方式发生变化,这有助于 the bit rot .

关于c - 定义 C 结构体的打包版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25562876/

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