2011-06-15 109 views

回答

3

微軟的解釋:

http://msdn.microsoft.com/en-us/library/aa273913(v=vs.60).aspx

IBM的AIX方xIC解釋:

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Fcompiler%2Fref%2Frnpgpack.htm

基本上,它確定存儲結構或聯合時將使用的字節邊界。推/彈出作爲一種方式來存儲和檢索堆棧上的這些設置。

爲了將來的參考,您可以通過在網絡上搜索您要求的關鍵詞來節省一些時間。我所做的一切找到這個信息是搜索「編譯包」在http://www.google.com

+0

謝謝您的回答。如果我在linux機器上運行服務器,我需要打包嗎? – codereviewanskquestions 2011-06-15 04:56:35

+0

@LCYSoft:參見[吉拉德Naors答案】(http://stackoverflow.com/questions/6353054/what-is-pragma-pack-for-in-network-progamming/6353230#6353230)。這是Microsoft特有的。 – Default 2011-06-15 07:21:17

1

這是MSVC++特定的包裝說明符。你可以從the documentation中找到它究竟做了些什麼。

封裝更改了多少填充編譯器允許在給定結構(或類)的數據成員之間插入以保持對齊。在網絡代碼的情況下,可能使用#pragma pack說明符,以便可以將結構轉換爲char*void*以傳遞給某個網絡API,以便一次性通過網絡發送整個結構。

(請注意,這是不安全的爲不同的機器有對齊和字節順序不同的規則;這一點,如果上線的每一端兩臺機器使用相同的硬件類型只會工作)

2

所有#pragma語句是供應商特定的。

這是一個特定於Microsoft的程序,它描述了編譯器爲了更好地對齊而可以將「包裝」(以字節爲單位)添加到struct

#pragma pack(push)只是保存和先前的設置在堆棧中。然後,您可以更改包裝條件的代碼的某一塊,後來就#pragma pack(pop)恢復到以前的設置。