[英]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::real
和std::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.