簡體   English   中英

保證的ANSI C結構大小

[英]Guaranteed ANSI C struct sizes

我只想使用標准C來讀取,編輯和寫入bmp文件,而無需任何外部庫。

如果我理解正確,則必須正確對齊字節以匹配bmp文件格式,這一點很重要。

但是,我想我也已經在互聯網上的某個地方讀到了編譯器被允許用額外的字節填充struct ,因此我無法始終確切確定我的結構占用了多少字節,甚至不能確定成員在結構中如何對齊。

如何僅使用標准C解決此問題? 是否有語法要求編譯器確保我的結構與我指定的結構完全相同?

如何僅使用標准C解決此問題? 是否有語法要求編譯器確保我的結構與我指定的結構完全相同?

C標准沒有提供控制結構布局的標准方法。 因此,如果只使用標准指定的內容,則無法使用結構來處理Windows位圖文件。

要使用標准C解決此問題,您需要寫入/讀取字節數組並自己對其進行序列化/反序列化。

正如Kninnug在評論中所說,BMP格式旨在與C結構類型兼容。 AC編譯器可以隨意在任意兩個struct成員之間或最后一個成員之后隨意插入任意填充,無論出於何種原因,但是在現實生活中,編譯器僅在需要對齊的地方插入填充,並且通常保持一致平台的書面ABI。

您可以使用offsetof宏和sizeof運算符進行測試 ,但不能指定struct類型的布局-這可能足以滿足您的目的。

例如,如果您想要一個符合外部施加的布局的結構,該布局由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()函數; 如果您的程序仍然存在,則可以確保布局是正確的。

好吧,幾乎可以測試字節順序了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM