3 回答

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
不,它不是完全便攜的。結(jié)構(gòu)的包裝選項(xiàng)是擴(kuò)展,并且它們本身不是完全可移植的。除此之外,C99§6.7.2.1第10段說(shuō):“單位內(nèi)的位域分配順序(從高階到低階或低階到高階)是實(shí)現(xiàn)定義的?!?/p>
例如,即使是單個(gè)編譯器也可能根據(jù)目標(biāo)平臺(tái)的字節(jié)順序不同地放置位字段。

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
從編譯器到編譯器,位字段差異很大,抱歉。
對(duì)于GCC,大端機(jī)器首先布置了大端,而小端機(jī)器首先布置了小端。
K&R說(shuō)“結(jié)構(gòu)的相鄰[bit-]字段成員在依賴于實(shí)現(xiàn)的方向上被打包到依賴于實(shí)現(xiàn)的存儲(chǔ)單元中。當(dāng)另一個(gè)字段后面的字段不適合時(shí)...它可以在單元之間分割,或者單元可以是寬度為0的未命名字段強(qiáng)制填充......“
因此,如果您需要與機(jī)器無(wú)關(guān)的二進(jìn)制布局,則必須自己完成。
最后一個(gè)語(yǔ)句也適用于填充引起的非位域 - 但是所有編譯器似乎都有一些強(qiáng)制結(jié)構(gòu)字節(jié)打包的方法,正如我在GCC中發(fā)現(xiàn)的那樣。
- 3 回答
- 0 關(guān)注
- 701 瀏覽
添加回答
舉報(bào)