C和C 的適用場合?如何建立C 實現的動態庫?動態庫如何保證向後相容,即二進位制相容性?

時間 2021-05-11 17:47:36

1樓:馮東

C 和 C++ 標準都沒有規定二進位制相容。但是這不意味著 C 和 C++ 在這件事情上是等同的。

所謂「標準沒有規定 A」,是說「不存在乙個通用的方法保證 A 在所有編譯器和 OS 的組合上都成立」。但是它並不會阻止乙個更弱一些的方案,就是「在每個編譯器和 OS 的組合上至少存在乙個方案讓 A 成立」。

C 語言是能夠保證後乙個弱方案成立的。因為任何 OS 的 dynamic linkage 方案都要給 C 編譯器提供乙個或者幾個可能的方案。而每乙個 C 編譯器也都會用至少一種方法去符合 OS 的標準。

C++ 是連後乙個弱方案都無法保證的。如果你保證編譯器和版本和 OS 的型別不變,甚至在某些 OS 上可以憑藉軟體商事實上的習慣在同一種編譯器的不同版本間保證動態庫的相容。不過這些終究只是一些習慣而已。

即不是承諾,也不保證在任何平台上都有可行方案。

如果要給動態庫設計 C++ 介面,最基本的要保證介面不涉及下列特性:

虛函式,沒有方法保證兩個編譯器可以互相相容 vtable

虛繼承,沒有方法保證虛繼承的類結構

多繼承,沒有方法保證多繼承的類結構

繼承,沒有方法保證繼承的類結構

成員函式,沒有方法完全確定成員函式的二進位制介面。

危險程度從高到低排列。上面的列表仍然不是 exhustive 的。

2樓:齊亮

Qt庫就是一種支援二進位制相容的C++庫。KDE是基於Qt的桌面環境,也支援二進位制相容性。

Qt和KDE專案多年的開發中,積累了很多C++關於二進位制相容的經驗。大致列舉如下:

關於如何確保二進位制相容,這裡有一些自動化的測試的程式:(先列舉一下,有時間再詳細寫)

(2023年1月22日更新一次)

3樓:featherwit

@蔣晟 回答的已經很全面了,我在一些點上稍微說下自己的經驗。

關於如何在windows/linux下建立動態鏈結庫網上有很多教程,就不贅述了。

二進位制相容性問題,對於基本資料型別,如int/long等等,可以考慮使用巨集定義來確定資料型別的長度。比如int32/int16/int8/int64等等。另外不僅僅是平台問題,比如vc6下time_t是32位的,而vc2010下time_t則是64位的。

那麼在實際應用中要考慮的這類資料型別一般是在介面部分,也就是說你的動態鏈結庫的介面部分設計要考慮到這個問題,內部實現則是另外一回事。

同樣的,由於動態鏈結庫的應用場景很廣,不一定會侷限於c/c++這一語言,在介面部分同樣要考慮的還有語言特性問題。比如盡量不要在介面層使用stl,介面函式的引數盡量用指標替代引用等等,以便於其它語言呼叫。積累經驗多了自然就知道了。

4樓:蔣晟

C和C++標準都沒有規定二進位制相容性(比如int/long/指標是16位,32位還是64位是沒有規定的,在有多個虛基類的時候,基類的實現順序也是沒有規定的)。

一些編譯器的實現,比如gcc和Clang,嘗試建立乙個共同標準,但是在編譯器的實現不完全遵守標準的時候,這也會造成很難除錯的相容性問題。

認為C++應該有二進位制相容性的程式設計師不多。比如Visual C++就不支援目標檔案的向下相容,甚至同乙個版本的編譯器,編譯選項不同的目標檔案也可能不相容。這使得Visual C++。

使用extern "C"來限制介面為C型別或者使用COM做介面可以繞過名稱修飾不同的問題,這在Window SDK中被廣泛使用,這使得你可以使用各種編譯器來開發Windows程式。但是這不能解決C標準規定編譯器自決的部分造成的二進位制相容問題(比如int/long/指標是16位,32位還是64位),所以你還是需要在包含Windows標頭檔案的時候和在鏈結Windows SDK庫時選擇你的目標平台是x86,x64還是ARM。

C或者C 如何建立可以容納任意大整數的資料型別?

習習谷風 高精度又不是什麼麻煩的東西。只要實現了list的封裝 鍊錶,變長陣列,還是平衡查詢樹看你資料的需要 再確定每一位的進製,base10效率太低,用1000就差不多了。然後自己封裝加減乘除,math庫的一些函式。 Alan Li 可以使用在金融方面廣泛採用的packed decimal十進位制...

C 如何實現優先佇列?

原生的Priority Queue已經被merge了 API 描述如下,感覺上符合大部分的需求了,應該是不是執行緒安全的,需要注意 namespace System.Collections.Generic public class PriorityQueue NB does not implemen...

c 裡如何實現static warning?

原子筆 template X struct example It just declares a function but does not define a variable define static warning x,str example x 0 1 30 str example 0 in...