簡體   English   中英

帶有C ++ 11源代碼的C ++ 03庫

[英]C++03 library with C++11 source code

如果我有用C ++ 03編寫的庫並將其編譯為靜態庫,那么我可以在C ++ 11中使用它嗎? 也是相反的可能(使用C ++ 03的C ++ 11靜態庫)。

更新:我使用的編譯器是clang或LLVM

這主要取決於您如何在庫中使用C ++標准庫。

  • 如果您根本不使用它,那么您不太可能遇到任何問題。

  • 如果您使用libstdc++ ,那么您可能會遇到一些問題:

    • 將標准庫對象傳入和傳出庫並不總是有效(例如,C ++ 11模式下的std::list最終會比目前在C ++ 98模式下更大,因為它正在增長一個size數據成員,並且std::string的表示形式正在變為非引用計數的表示。 g ++開發人員計划引入一種符號污染形式,以便在鏈接時捕獲這些問題,因此如果遇到任何有問題的情況,你會遇到錯誤,但是這還沒有在g ++中實現,可能永遠不會在鐺。 您可以通過確保庫的接口不涉及標准庫類型來避免此問題。

    • 一些符號可能會改變含義(例如, std::complex::realstd::complex::imag在C ++ 98模式下返回引用,但由於constexpr缺陷而在C ++ 11模式下按值返回) 。 如果使用C ++ 98和C ++ 11表單鏈接在一起(未優化)代碼,則可能選擇了錯誤的實現,在運行時會出現奇怪的結果。

  • 如果您使用libc++ ,則不應該看到任何問題。 libc++被設計為C ++ 98和C ++ 11模式之間的二進制兼容。

  • 如果在庫中使用libc++ ,在libc++中使用libstdc++ ,反之亦然,那么大多數不兼容性將在鏈接時捕獲。 libc++namespace std包含其大部分符號的inline namespace namespace std ,如果您嘗試跨越邊界傳遞libstdc++的類型,則會導致鏈接時不兼容)。 然而,你可能仍然有運行時的問題,如果你的庫的接口間接包含標准庫類型(例如,如果它使用一個struct具有標准庫類型的成員)。 對於libc++沒有版本的類型,它的目標是與libstdc++二進制兼容(在C ++ 98和C ++ 11模式下)。

取決於編譯器。 例如,GCC在C ++ 11模式下破壞了C ++ 11中ABI發生變化的標識符。 所以,例如,如果你不使用std::list東西,那你就沒事了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM