保证ANSI C结构大小

时间:2013-06-29 20:23:29

标签: c struct ansi

我想使用标准C来读取,编辑和编写没有任何外部库的bmp文件。

如果我理解正确,重要的是正确对齐字节以匹配bmp文件格式。

但是,我想我也在互联网上的某处读过,允许编译器用额外的字节填充struct所以我不能总是确定我的struct占用多少字节,甚至成员如何在结构中对齐。

如何使用标准C解决此问题?是否有一种语法要求编译器确保我的结构看起来与我指定它的方式完全相同?

2 个答案:

答案 0 :(得分:4)

  

如何使用标准C解决此问题?是否有一种语法要求编译器确保我的结构看起来与我指定它的方式完全相同?

C标准没有提供控制结构布局的标准方法。因此,如果您仅使用标准指定的内容设置,则不能使用结构来处理Windows位图文件。

要使用标准C解决此问题,您需要编写/读取字节数组并自行序列化/反序列化。

答案 1 :(得分:1)

正如Kninnug在评论中所说,BMP格式旨在与C结构类型兼容。无论出于何种原因,AC编译器都可以随意插入任意两个结构成员之间或最后一个成员之后的填充 - 但在现实生活中,编译器只在需要对齐的地方插入填充,并且通常符合要求到该平台的书面ABI。

您可以使用offsetof宏和sizeof运算符来测试,但不能指定结构类型的布局 - 这对您来说可能已经足够了目的。

例如,如果你想要一个符合外部强加的布局的结构,该布局由一个32位无符号整数,一个16位无符号整数和两个8位无符号整数组成,按顺序分配总计为64位,你可以这样写:

#include <stdint.h>
#include <stddef.h>
#include <assert.h>

struct s {
    uint32_t a;
    uint16_t b;
    uint8_t c;
    uint8_t d;
};

void test_layout(void) {
    assert(offsetof(struct s, a) == 0);
    assert(offsetof(struct s, b) == 4);
    assert(offsetof(struct s, c) == 6);
    assert(offsetof(struct s, d) == 7);
    assert(sizeof (struct s) == 8);
}

程序启动时调用test_layout()函数;如果你的程序存活了,你可以放心,布局是正确的。

嗯,几乎 - 测试字节顺序留作练习。