2011-03-26 21 views
5

我有一個非常大的C++代碼庫(不是自己寫的)。許多圖書館,有些不是那麼重的語法,有的非常如此。 其中有大量使用Boost,一些Eigen。gnu C++ 0x向後兼容性狀態 - 我可以打開它並繼續嗎?

我只是喜歡0x的一些新功能,並且一個快速編譯/測試告訴我,它似乎都很好。 This questionand this one暗示有些東西聞起來很有趣。

我現在的狀態是:

  • gcc4.4.3
  • libstC++ 6-4.4
  • 升壓1.40
  • 徵3.0 - 使用std=c++0x標誌beta3版

我知道標準委員會對向後兼容性和忍受嚴重的痛苦感到痛苦。 我的問題是,它工作?我可以採取所有的代碼,切換C++ 0x並確定,一切都不僅編譯,但也按預期工作?

我不使用高0x魔術,只是auto和一些通常的收藏夾明確標記爲「實施」GNU C++0x status

+2

嘗試新的熱門語言,它被稱爲C89 :)。適用於一切。你甚至可以在你的C++編譯器中使用它!保證不中斷升級。 – 2011-03-26 12:28:25

+0

像「sizeof('a')」這樣的東西在由C++編譯器編譯時會產生不同的結果,因此即使使用C89也不能保證。但是有沒有任何C++ 98代碼在C++ 0x下靜靜地改變行爲的非人爲的例子? – Clinton 2011-03-28 00:24:16

+0

@Clinton:查看http://stackoverflow.com/questions/5759232/stdvector-default-construction-c0x-and-breaking-changes – 2011-04-27 07:38:15

回答

2

你的問題沒有答案,這取決於你的代碼。嘗試編譯,修復編譯時問題。編譯完成後,運行測試用例並修復需要修復的任何需求。

如果您沒有測試代碼,請從此處開始。

+0

我只是一大堆圖書館的用戶。其中一些只有標題模板很重。我無法測試他們。在這樣大的系統中,我無法檢查是否有東西在爬行。 – AndreasT 2011-03-26 11:34:12

+2

這就是有些人所說的「集成測試」 - 您檢查這些庫的使用情況仍然按預期工作。檢查每個圖書館的供應商/項目,看看它們是否適用於C++ 0x,與您的GCC版本一起實施。如果即使您不能分辨您的軟件是否正常工作,您希望其他人可以如何? – Mat 2011-03-26 11:39:30

3

我肯定會推薦使用GCC 4.5,因爲它包含更多的錯誤修復和更堅實的最新C++ 0x實現。

關於你鏈接的問題:

  1. 這僅僅是一個新的平臺類型定義。不要擔心這一點,它不會真的破壞任何東西或難以修復。

  2. 這是一個比較複雜的C++ 0x特性,但不應該對向後兼容性產生太大影響(除非boost試圖將自己破解爲一個將成爲編譯器/語言的特性特徵)。

檢查是否存在問題的唯一方法是打開編譯器標誌並查看是否有任何問題彈出。更好的是,打開全面的警告(至少在GCC上,MSVC在這方面有一些棘手的問題),以檢測儘可能多的被顛覆的問題。雖然這不是防水的。您可能想使用不同的編譯器(GCC/MSVC/Intel/Clang)來交叉檢查兼容性,但在C++ 0x的情況下,您將僅限於用於檢查的編譯器的常見子集。目前我廣泛使用C++ 0x,並打算解決實現最終標準時出現的任何問題。

+1

用於打開警告:對編譯器的內置機制有一定的信任,以檢測有些東西味道不好。然後測試一下,看看它的行爲是否像預期的那樣。 – 2011-03-26 11:56:23

+0

@Matthieu:我沒有提到警告標誌,但這是個好主意。編輯:) – rubenvb 2011-03-26 13:53:00

+0

啊!我讀*打開編譯器標誌*,並認爲你在談論警告:D – 2011-03-26 14:24:17

1

這是不知道代碼庫的基礎上回答。特別是,如果向後兼容100%,則可能會發現通過在同一標準內升級/更改編譯器可以找到的相同問題:

如果您的代碼不是標準的,如果它使用特定於編譯器的功能或版本,如果它有任何未定義行爲的實例或取決於剛剛在您當前平臺中工作的未指定行爲,那麼如果可能無法編譯(如果您幸運的話)或在運行時展現不同的行爲(如果您不幸) 。

+0

+1,可移植性問題的最大原因一直是近乎正確的代碼。 – MSalters 2011-03-28 09:47:07