簡體   English   中英

g ++ -std = c ++ 0x和兼容性

[英]g++ -std=c++0x and compatibility

我正在使用g ++ 4.4在linux上編譯共享庫。 如果我可以在庫中,我想使用一些C ++ 11功能,但我無法更新編譯器的版本或我的庫用戶需要任何特殊的編譯器開關。

我有兩個問題,我很難找到明確的答案。

  1. 如果我使用-std = c ++ 0x或-std = g ++ 0x編譯共享庫,我保證使用我的庫的程序不需要那些開關(假設我沒有c ++ 0x功能)頭文件)? 它似乎有效,但我不想在未來注冊微妙的問題。

  2. g ++ 4.4中C ++ 11的標准庫非常不完整。 由於標准庫的大部分都是標題庫而且gnu的頭文件通常都是版本ifdef,我認為可能有一種方法可以使用libstdc ++中至少頭文件的更新版本。 不過,我不能使用不同的.so。 我確信我可以將它們整合在一起,但有可能正確地做這樣的事情嗎?

謝謝。

1.如果我使用-std = c ++ 0x或-std = g ++ 0x編譯共享庫,我保證使用我的庫的程序不需要那些開關(假設我沒有c ++ 0x)頭文件中的功能)? 它似乎有效,但我不想在未來注冊微妙的問題。

C ++ 11支持在GCC 4.x版本中仍然是實驗性的(它不再是從GCC 5開始的實驗)。 雖然我們試圖讓事情保持正常,但答案是肯定的,但通常不能保證在所有情況下都能正常工作。 使用-std=c++0x導致的許多ABI更改可能會導致混合C ++ 03代碼和C ++ 11代碼的程序出現問題,請參閱http://gcc.gnu.org/wiki/ Cxx11AbiCompatibility了解更多詳情。 如果您的圖書館沒有導出該頁面上描述的任何符號,那么您應該沒問題。

2. g ++ 4.4中C ++ 11的標准庫非常不完整。 由於標准庫的大部分都是標題庫而且gnu的頭文件通常都是版本ifdef,我認為可能有一種方法可以使用libstdc ++中至少頭文件的更新版本。 不過,我不能使用不同的.so。 我確信我可以將它們整合在一起,但有可能正確地做這樣的事情嗎?

不,絕對沒有任何機會可行。 更高版本的標題使用4.4不支持的功能,即使您可以使用它們,您也需要使用較新的libstdc++.so 就是不行。

標題中沒有 #ifdefs版本,幾乎唯一可以找到的是__GXX_EXPERIMENTAL_CXX0X__檢查,當你使用-std=c++0x時這是由G ++定義但這並不意味着你的4.4版本支持lambdas,非-static數據成員初始值設定項,正確的右值引用語義,默認/刪除函數等,以后的標題可以自由使用。 必須將libstdc ++標頭與它們附帶的相同版本的GCC一起使用。

簡而言之,如果您需要適當的C ++ 11支持,則需要使用更新的編譯器。

如果您不能使用較新的編譯器,則無法獲得正確的C ++ 11支持。

我不會嘗試這個。 所需要的只是在標頭中使用一個C ++ 11定義的宏來更改類或函數的定義,並且最終用戶將違反單定義規則。 這些用途可能是我想象的非常微妙。

然后在類似的說明中,有一個vector(count, item = T())構造函數在C ++ 11中不再存在(它現在是兩個構造函數)。

簡而言之,您必須非常小心您在庫中使用的標准庫組件,以避免違反一個定義規則,我無法想象破壞的風險值得使用這些功能。

可以做的是使用boosttr1來填補語言空白,直到您可以使用新的編譯器和/或允許您的最終用戶使用C ++ 11支持進行編譯。

暫無
暫無

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

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