#pragma pack 控制結構體/聯集成員的記憶體對齊值(1,2,4,8,16)。在標頭檔中使用時必須成對呼叫,否則會汙染引用該標頭檔的其他原始檔,導致結構體大小計算錯誤、指標偏移錯誤,嚴重時引發非法記憶體存取或程式崩潰。
#pragma pack(n) / #pragma pack()// header1.h
#pragma pack(1) // 設定 1 位元組對齊
struct S1 { int i; char c; bool f; };
// struct S2 { ... }
#pragma pack() // 恢復預設對齊(與開頭配對)
#pragma pack(push, n) / #pragma pack(pop)(推薦)// header2.h
#pragma pack(push, 1) // 將當前對齊值壓入堆疊,設為 1
struct S3 { int i; char c; bool f; };
// struct S4 { ... }
#pragma pack(pop) // 彈出堆疊,還原先前對齊值
堆疊模式支援巢狀、多元件整合,更安全。
#pragma pack( [n] ) // n = 1,2,4,8,16
#pragma pack( [ [ { push | pop } [, identifier ] ] [, n ] ] )
push:將目前對齊值存入內部編譯器堆疊;可選 identifier 命名。pop:從堆疊彈出還原;若指定 identifier 則彈出至該標記。push/pop。#pragma pack(n) 不還原,除非該檔為獨立編譯單元且確定無副作用。alignas / 屬性 __attribute__((packed)) 等標準化寫法。