我有指定爲以下如何覆蓋C編譯器對齊字大小可變以struct到字邊界
- 成員1,16位
- 會員2,32位
- 會員3的結構, 32位
我將從文件中讀取。我想直接從文件讀入結構。
的問題是,C編譯器將調整變量M1,M2和M3到字邊界,其在32位,因爲我上了ARM Cortex M3工作爲以下結構聲明:
typedef struct
{
uint16_t m1;
uint32_t m2;
uint32_t m3;
}something;
直接從文件中讀取將以m2和m3爲單位輸入錯誤的值,並讀取2個額外的字節。
我已經破解四周,我目前使用的工作只是正常的情況如下:
typedef struct
{
uint16_t m1;
struct
{
uint16_t lo;
uint16_t hi;
}m2;
struct
{
uint16_t lo;
uint16_t hi;
}m3;
}something;
然而,這看起來像一個非常骯髒的黑客。我不禁要求一種更簡潔的方式來強制編譯器用不同的詞語來表達m2和m3的一半,然而這可能是次優的。
我正在使用arm-none-eabi-gcc。我知道有關打包,但無法解決此優化。
編輯:原來我不知道足夠有關bit-包裝:d
你的意思是你的編譯器贏得'讓你把結構聲明爲包裝? –
'arm-none-eabi-gcc'與'packed'屬性一起工作得非常好(除非編譯了一些奇怪的設置,我猜...)。那麼,也許一些古代版本不是... –
雖然我知道指定每個字段的位數,但我完全不知道打包的屬性。不奇怪,我不知道它,因爲我有點害怕__attribute()__ s。哦,這似乎工作得很好 – TSG