1. 程式人生 > >#pragma pack (n) 惹的禍

#pragma pack (n) 惹的禍

bsp http 結構體 fcm 今天 iss 順序 對齊方式 保存

今天遇到了一個問題,使用數據流傳輸的數據在解析的時候數據錯位。想了非常久,發現是#pragma pack (n)惹的禍。


首先。解析方使用了編譯字節設置,可是在發送方沒有使用,於是用相同的結構體解析數據時候,有兩個字節被0占用了。後來統一使用。問題解決。


例如以下圖的struct結構體:不使用#pragma pack (1)時候,在解析RemotPort後是沒問題的,再解析RemotIp的時候,通過字節轉換後。ip地址的前兩位是0.0.X.X 原因是WORD不夠4字節,編譯器自己主動填了0占位。


這是給編譯器用的參數設置,有關結構體字節對齊方式設置, #pragma pack是指定數據在內存中的對齊方式。
#pragma pack (n) 作用:C編譯器將依照n個字節對齊。
#pragma pack () 作用:取消自己定義字節對齊方式。


#pragma pack (push,1) 作用:是指把原來對齊方式設置壓棧,並設新的對齊方式設置為一個字節對齊
#pragma pack(pop) 作用:恢復對齊狀態
因此可見,增加push和pop能夠使對齊恢復到原來狀態,而不是編譯器默認,能夠說後者更優,可是非常多時候兩者區別不大
技術分享




如:
#pragma pack(push) //保存對齊狀態
#pragma pack(4)//設定為4字節對齊
相當於 #pragma pack (push,4)

#pragma pack (1)
作用:調整結構體的邊界對齊,讓其以一個字節對齊;<使結構體按1字節方式對齊>


可是假設調換一下結構體中DWORD和WORD的順序。則結果又不同。例如以下:

技術分享

#pragma pack (n) 惹的禍