C語言中如何定義可移植的結構體?

時間 2021-06-01 11:59:29

1樓:

專案裡經常遇到類似的情況。我們通常都使用巨集來解決。如:

struct myStruct

;成員變數型別統一使用:

S16(16位有符號數)

U16(16位無符號數)

S32(32位有符號數)

U32(32位無符號數)……

2樓:吳才澤

在真正的多平台移植過程中,結構體定義的可移植性反而不太關注,要關注的是程式本身的可移植。

如果是內部運算,一般要避免繞過編譯器(提供的成員位址)而直接用指標之類的操作結構體裡某偏移成員的"不規範"行為。

如果是處理外部通訊資料報,則定義好hton,ntoh,並加個巨集選項方便大小端移植。

舉個栗子,簡單的ucos可以移植到8,16,32位晶元上,移植過程只要定義好一些基本資料型別,編寫cpu相關的巨集,c函式,以及高頻的上下文切換用到的彙編函式就可以了。好像沒有注意到對結構體的特殊處理。

ps:有些答主提到protobuf,但個人認為pb主要是用於多語言環境下的資料序列化通訊(利用統一的.proto為媒介),如果都是c語言就完全可以不用pb中轉,他們可能是把cpu平台和語言平台弄混了。

3樓:

yourstruct ;

//aligned by different architecture

//Like the x86 ,use #pragma macro//like the arm,use __attribute__() function

4樓:歐文韜

就不應該在語言層面解決這個問題,可以嘗試protobuf,flatbuffer,capn proto,msgpack,json等等來解決這個問題

5樓:藍色

gcc.gnu.org/bugzilla/show_bug.cgi?id=51628

,這裡面提到了stackoverflow的乙個例子可以出現在x86 ok,但是SPARC下會出現Bus Error的情況。

那麼,若是這樣的話,若想能夠100%的可移植的話,我覺得有乙個辦法或許可以,那就是使用unsigned char的陣列,並且跟蹤struct的每個成員占用的位元組範圍。

c語言中,定義兩個結構體,為什麼順序不同,sizeof大小不一樣

已登出 要對齊啊,首先任何型別不做對齊聲明的話,長度為字長的倍數。型別在父型別中的開始位置為自己長度的倍數,在s1中 a開始位置為1的倍數,b開始位置為4的倍數,c開始位置為2的倍數,因此a的偏移為0,b為4 7,c為8 9,整個結構體需要長度為12 宅學部落 王利濤 為了簡化 CPU 和記憶體 R...

怎麼使用c語言中的sort排序,在結構體裡面按學號排序??

陳舸 問題描述的不是很清楚,不過我大概猜你是想對某些結構體做排序,結構體裡有個學號的字段,要以學號為標準來排序?可以使用qsort 隨手碼了乙份。include include include typedef struct student Student int compare const void...

如何理解C語言中的識別符號?

Milo Yip 識別符號 cppreference.com識別符號能指代下列型別的實體 物件函式 標籤 struct union 或列舉 結構體或聯合體成員 列舉常量 typedef 名 標號名巨集名 巨集形參名 就是程式設計師可以命名一些東西,不要想得太複雜。 chenc 讀書是為了獲取知識,獲...