3 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
我不知道這樣做的光滑方式,但你可能會(huì)做一些可怕的事情:
#include "packed.h"struct Foo { /* members go here */ } PACKED;#include "endpacked.h"
那么對(duì)于MSVC,packed.h:
#define PACKED#pragma pack(push,1)
endpacked.h
#pragma pack(pop)#undef PACKED
對(duì)于gcc,packed.h:
#define PACKED __attribute__ ((__packed__))
endpacked.h:
#undef PACKED
從根本上說(shuō),包裝過(guò)于依賴平臺(tái)。假設(shè)您的壓縮結(jié)構(gòu)中包含8位字段,并考慮一些具有16位字節(jié)的系統(tǒng)。它只能通過(guò)打包來(lái)形成一個(gè)表示數(shù)據(jù)的結(jié)構(gòu) - 你必須知道在兩個(gè)系統(tǒng)之間傳輸時(shí)如何將8位字節(jié)轉(zhuǎn)換為16位字節(jié)。16位機(jī)器上的結(jié)構(gòu)可能需要位域,在這種情況下,您必須知道實(shí)現(xiàn)如何實(shí)現(xiàn)它們。
因此,如果代碼通常是可移植的,您可能只需要在頭文件的特定于平臺(tái)的部分中定義所需的任何打包結(jié)構(gòu)。或者更確切地說(shuō),構(gòu)造您的代碼,以便未來(lái)的端口可以做到這一點(diǎn),如果必須的話。

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以為GNU gcc定義這樣的PACK
#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))
和Visual C ++一樣:
#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
并像這樣使用它:
PACK(struct myStruct{ int a; int b;});
- 3 回答
- 0 關(guān)注
- 1152 瀏覽
添加回答
舉報(bào)