2014-10-12 90 views
2

我知道我們不應該混合使用不同版本的MSVC++編譯的代碼,除非完全隔離語言運行時和COM in-proc服務器。什麼是MSVC++中std :: type_info的前向兼容性?

但有些人認爲他們可以和轉發兼容性不是你可以提前幾年保證的東西。尤其是,該庫(2006年)使用的方案允許一個DLL跨不同編譯選項和RTL動態/靜態選擇的調用方工作,因爲動態庫始終命名爲msvcrt.dll。現在不是這樣,所以處理它是有挑戰性的。但這不是發佈的原因。

每個人都會考慮堆函數(malloc,free,operator new等)以及跨DLL邊界傳遞指針。但是我看到了其他一些沒有得到解決的東西。也就是說,頭文件使用std::type_info來存儲類型值(類似於語言環境方面或Boost.Any),所以隱含的假設是調用者(使用VS10)可以創建包含std::type_info值的類的實例,編譯DLL(使用一些舊版本的編譯器)可以理解它們。

正如我回顧一下type_info之前的實現,它使用低效的字符串比較來跨越鏈接器邊界工作。但是,這隻允許重複的靜態常量被視爲等價的 - 它仍然要求type_info的底層實現是相同的!

所以,沒有人知道發生如果結構和字段的解釋執行其中已更改,或者仍然是相同的,不同版本的RTL作爲發貨不同版本的Visual Studio?即使沒有確切的答案,我也希望以任何方式瞭解經驗。

我也看到在標頭中使用std::string。 <嘆>

回答

1

我一直在嘗試了std::string,在調試版本發現,不是的Visual Studio 2005(第8版)和VS 2010(10版本)之間的兼容。數據指針的位置是不同的,特別是。因此,由VS2010創建的std::string無法用VS 2005編譯的代碼正確解釋。

我確定這是發佈版本的相同故事。我記得std::string尤其與微軟庫中的STL容器不同,它與某些運行時檢查選項更具兼容性,因此它不僅僅是編譯器開關的細節 - 儘管這對於兼容性來說總是一個問題,即使在C++編譯器是相同的版本!

我沒有了解std::type_info,但其中一個問題足以拒絕相容性。

我想指出一點,避免實際傳遞字符串和使用在ABI兼容的調用具有隱藏的陷阱:默認參數。默認參數是由調用者自動構造和傳遞的,並且您可能不知道在移植舊代碼或什麼時候會出現這樣的可選參數。

即使業務團隊發現它出於某種原因具有吸引力,也要小心不透明的預構建產品。十年後,「他們」可能不再支持該產品,而隨着意想不到的事情發生變化,向前兼容計劃將逐漸失敗。