2012-09-11 30 views
1

假設我有一個不使用任何C++ 11的跨平臺(Win & Mac)生產代碼庫。將C++方言改爲C++ 11,但將標準庫非C++ 11保留在XCode4上有風險嗎?

假設mac上的編譯器選項已更改爲使用C++ 11語言方言,但未使用C++ 11標準庫。

我試着用Google搜索瞭解可能的含義,但是我會空着。

我的問題是:

  1. 是什麼改變鐺語言方言甚至是什麼意思?
  2. 做這種事情的風險是什麼?
+0

C++ 11不是「語言方言」。它是該語言的新版本。 「方言」意味着某種交叉兼容性。 –

+3

我只使用方言這個詞,因爲爲了讓C++ 11代碼在XCode4上編譯,需要爲C++ 11設置「Language Dialect」和「Standard Library」編譯選項。我明白你的觀點。 – Carl

回答

5

我不使用XCode,但我想如果他們正在運送一個(大概不完整但到達那裏)C++ 11模式的叮噹聲,那麼他們也出貨(大概不完整但到達那裏)C++ 11標準庫。並一起測試它們。所以,你的情況不應該出現,但假設它反正:

  1. 形式上,這並不意味着什麼,因爲標準不承認混合和匹配的「語言」的任何方式和「庫」。這取決於你的編譯器它認爲它的意思。可能它意味着像右值引用,lambda等新的「語言特性」變得可用,但名稱空間std中的新類和函數不可用。

  2. 主要的風險可能是你不再編程到一個公認的標準,你正在編寫一個可能由你的編譯器發明的文件不足的東西。如果編譯器說在C++ 11模式下它需要一個C++ 11標準庫,並且你提供了一個C++ 03標準庫,那麼你甚至沒有責備編譯器文檔 - 任何可能的發生,你破壞了它,你的錯。

從這個有趣的組合的風險相當之外,還有在服用C++ 03的代碼庫,並使用任何 C++編譯器11編譯它小的風險。在C++ 03中有一些代碼結構可以編譯爲C++ 11,但具有微妙(或嚴重)不同的含義。

例如,它只是有可能編寫一個C++ 03中的類,在C++ 11中使用時會中斷,因爲C++ 11將生成一個不正確的移動構造函數。有時你必須替換一個編譯器生成的拷貝構造函數,它不會做正確的事情(Rule of Three),而C++ 11確保在那些「正常」的情況下移動構造函數被抑制,有一些奇怪的邊緣案例。不幸的是,我現在不記得他們。

C++ 11標準列出了C++ 11和C++ 03之間的一些不兼容問題。你會希望一切,但你知道它是如何。這份名單是在附錄C.它開頭:

有效C++ 2003代碼可以編譯失敗或在本國際標準產生不同的結果 。具體而言,宏命名Ru8u8RuuRUUR,或LR也不會被展開時鄰近於弦 字面但將被解釋爲字符串文字的一部分。

它並沒有得到更多的鉚接閱讀。但它基本上是一系列事情,如果它們出現在C++ 03代碼庫中,則需要更改以獲得等效的C++ 11。

+1

更不用說那些不能在C++ 11中工作的C++ 03構造可能出現在C++ 03 *標準庫*中。 –

+0

@NicolBolas:非常好。所有相同的問題適用於提問者代碼庫的庫實現。 –

+0

謝謝。我還在標準附錄C中找到了C++ 11和C++ 03之間的區別列表,這裏是:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/ n3376.pdf – Carl

0

不要忘記,很多C++ 11語言功能都支持庫功能,例如,如果沒有std::movestd::forward的右值引用,並且初始化程序列表也是垃圾的,那麼對於右值引用沒有多大用處。

1

雖然沒有真正的「風險」,但C++ 11的許多價值都來自庫。

將語言更改爲C++ 11表示支持C++ 11語言功能。如果你看看標準,你會發現它分爲語言(條款1-16)和圖書館(條款17-30)。語言特徵包括語法,表達式和語句的含義,重載解析等內容。庫特徵涵蓋標準頭文件的內容。所以如果你需要一個特定的頭文件來在C++ 11中做某些事情,那麼你可能需要一個C++ 11標準庫。

Xcode支持gcc 4.2附帶的libstdC++版本,它是爲C++ 03構建的。當clang設置爲C++ 11模式時,這工作正常。它還支持libC++,即使使用C++ 03編譯器,也可以提供許多C++ 11功能。所以混合和匹配應該在很大程度上正常工作。但是,通過使用爲彼此設計的語言和庫,您將獲得更多價值。

0

GCC和clang編譯C++的方式稍有不同。這可能對你的情況沒有任何影響,但在別人的情況下,你可以切換回GNU風格的編譯。因此「語言方言」。

只要你保持語言和stdlib設置爲GNU版本,它應該沒有區別。但是,在GNU方言中使用Apple LLVM編譯器(clang)進行編譯可能不會產生與Windows上相同的結果(假設您在兩者上使用GCC)。我會說,除非在兩個平臺上使用匹配的庫,編譯器和設置,否則總是處於某種風險之中,特別是當第三方庫發揮作用並且將libstdC++換爲libC++以獲得C++ 11支持時。

如果你在windows上使用VC++,那麼C++ 11支持相當欠缺,所以當你的XCode代碼拒絕用VC++編譯時,不要感到驚訝。