首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC 6.0 結構體對齊突破:輕鬆讀寫 DOS 相容二進制檔案

     編輯:VC 教學

問題背景

在 VC 5.0 時代,MFC 專案預設結構體成員對齊為 8 位元組,且無法透過專案設定 Struct member alignment 改為 1 位元組 (設定會被忽略)。這導致結構體大小與預期不符,若需與 DOS 環境共享二進制檔案 (特別是含位元欄位的結構),讀寫資料會錯位、內容亂碼。

VC 6.0 的解決方案

Visual C++ 6.0 修正了此限制,現在可以方便地將結構體對齊設為 1 位元組,完美支援跨平台二進制資料交換。

方法一:專案設定 (GUI)

  1. 專案 → Settings → C/C++ 分頁 → Category 選 Code Generation
  2. Struct 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 位元組)8int(4) + char(1) + char(1) + padding(2)
#pragma pack(1)6int(4) + char(1) + char(1) 無填補

適用情境

  • 與嵌入式系統 (DOS、RTOS、裸機) 交換二進制協定封包。
  • 讀寫舊版資料庫檔案、二進制日誌、通訊協定結構。
  • 需精確控制記憶體配置的高效能資料結構。

注意事項

  • #pragma pack 影響範圍為編譯單元,建議成對使用 push/pop 避免汙染其他結構。
  • 1 位元組對齊可能降低 CPU 存取效能 (非對齊存取),僅在必要結構上啟用。
  • 跨編譯器 (GCC、Clang) 時對應指令為 __attribute__((packed))。

結語

VC 6.0 解決了長期困擾開發者的結構體對齊問題,配合 #pragma pack(1) 即可輕鬆實現與 DOS/嵌入式系統的二進制檔案完美互通,結束了「為了對齊而寫 DLL」的痛苦歷史。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved