在 VC 5.0 時代,MFC 專案預設結構體成員對齊為 8 位元組,且無法透過專案設定 Struct member alignment 改為 1 位元組 (設定會被忽略)。這導致結構體大小與預期不符,若需與 DOS 環境共享二進制檔案 (特別是含位元欄位的結構),讀寫資料會錯位、內容亂碼。
Visual C++ 6.0 修正了此限制,現在可以方便地將結構體對齊設為 1 位元組,完美支援跨平台二進制資料交換。
Code GenerationStruct member alignment 選擇 1 Byte#pragma pack(push, 1) // 儲存當前對齊並設為 1
typedef struct tagPACKAGE {
int intValue;
char chValue1;
char chValue2;
} PACKAGE, *LP_PACKAGE;
#pragma pack(pop) // 還原原對齊設定
| 對齊設定 | sizeof(PACKAGE) | 說明 |
|---|---|---|
| 預設 (4/8 位元組) | 8 | int(4) + char(1) + char(1) + padding(2) |
| #pragma pack(1) | 6 | int(4) + char(1) + char(1) 無填補 |
#pragma pack 影響範圍為編譯單元,建議成對使用 push/pop 避免汙染其他結構。__attribute__((packed))。VC 6.0 解決了長期困擾開發者的結構體對齊問題,配合 #pragma pack(1) 即可輕鬆實現與 DOS/嵌入式系統的二進制檔案完美互通,結束了「為了對齊而寫 DLL」的痛苦歷史。