【发布时间】:2014-08-29 06:39:06
【问题描述】:
我在代码之外的某个地方定义了一个 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) 相同.有没有办法达到预期的效果?
以防万一您想知道:我想解析通过网络接收的数据包,这些数据包只是打包结构。问题是,我不能修改头文件,因为它是第三方库的一部分,而且结构本身包含的字段太多,无法一一复制。我当然可以将结构定义复制到我自己的标题中并制作打包版本——实际上这是我现在使用的解决方案——但我只是想知道是否有更简洁的解决方案不涉及复制整个定义.
【问题讨论】:
-
一个有趣的问题,但我不认为你会找到一个优雅的解决方案; “您只能在枚举、结构或联合的定义上指定此属性,而不是在未定义枚举类型、结构或联合的 typedef 上。” gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html