2012-04-27 165 views
3

是否存在的__attribute__ ((__packed__))便攜式__attribute__((__packed__))

便攜式當量(以便攜性我的意思是在PC,Android和iPhone的合作,無論架構)

+3

簡單的回答:沒有。 – bmargulies 2012-04-27 15:37:53

+0

@bmargulies:實際上,C++ 11中的'alignas'使得它更簡單 – KillianDS 2012-04-27 15:59:39

+0

噢,好吧。我把它留作評論,因爲我害怕這樣的事情。 – bmargulies 2012-04-27 16:05:01

回答

4

根據定義,__attribute__是不可移植的。如果你希望你的數據的特定方式,Plan9相關解決方案通常是在你的結構使用unsigned char數組:

struct foo { 
    uchar data1[4]; 
    uchar other[2]; 
} 

通常不會有任何調整,因爲它從根本上使用的無符號的字符。當然,如果你有疼痛的高耐受性,你總是可以使用偏移的enum

enum { FOO_DATA1=0, FOO_OTHER=4, FOO_LAST=6 }; 

然後,您可以加載它就像這樣:

unsigned char foo[FOO_LAST]; 
uint32_t n = htonl(val) 
memcpy(foo+FOO_DATA1, &n, sizeof n) 
memcpy(foo+FOO_OTHER, &some_16_bit_val, sizeof some_16_bit_val) 

只要你有它的胃,它將是完全便攜的。

+0

謝謝,我實際上正在爭取第一個解決方案。我不知道它對Plan9的具體情況 – 2012-04-27 15:52:55

1

號結構的包裝和填充不部分的C++語言規範(它屬於平臺ABI),所以處理它的任何內容都在本質上在語言之外。

+0

即使對齊確實涉及到平臺ABI,現在它是標準的一部分。打包是另一個不合標準的原因,編譯器開發人員基本上被迫添加非標準擴展來提供它。 – ceztko 2017-06-13 21:32:46