2012-04-28 163 views
258

我試圖將我的C++編譯器更新到C++ 11。 我已經搜索了一下,我得出結論,我必須使用國旗-std=c++0x-std=gnu++0x,但我不知道很多關於標誌的事情。誰能幫我? (我使用Ubuntu 12.04。)用g ++編譯C++ 11

這裏是我從編譯器得到的錯誤,當我嘗試使用這是在包括C++ 11(即陣列)庫:

#include <array> 
#include <iostream> 

int main() 
{ 
    std::array<int, 3> arr = {2, 3, 5}; 
    ... 
} 

This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.

+0

這取決於你使用的建設什麼樣的編譯程序。 Makefile文件?蝕?還有別的嗎? – dutt 2012-04-28 12:54:46

+3

在最新版本中,您可能不得不使用'-std = C++ 11'。不過,也許兩者都是允許的。 – 2012-04-28 12:56:04

+6

這忽略了很多上下文。顯示你試過的完整命令(甚至可能是你試圖編譯的示例代碼),以及實際上失敗的代碼。 – KillianDS 2012-04-28 12:56:44

回答

386

標誌(或編譯器選項)只是傳遞給編譯器可執行文件的普通命令行參數。

假設你從命令行(終端)調用克++:

$ g++ -std=c++11 your_file.cpp -o your_program

$ g++ -std=c++0x your_file.cpp -o your_program

如果上述不工作。

+6

不要忘記在'g ++'後面加上'-Wall -g' – 2012-04-28 13:41:54

+5

@BasileStarynkevitch:我也會添加'-Werror',沒有理由不在啓動項目時。 – 2012-04-28 14:14:08

+0

它的工作!非常感謝你! – 2012-04-28 14:25:13

11

你的ubuntu肯定有一個足夠新的g ++版本。要使用的標誌是-std=c++0x

+0

你怎麼能這麼說,他使用的是Ubuntu嗎?只是好奇知道。 – Shravan40 2014-11-08 08:21:01

+9

@ Shravan40 OP在問題中明確表示'我正在使用Ubuntu 12.04.'。 – 2014-11-09 18:10:35

8

如果要保留GNU編譯器擴展,請使用-std = gnu ++ 0x而不是-std = C++ 0x。下面是從該名男子頁報價:

編譯器可以接受一些基礎標準,如這些標準C89或C++ 98, 和GNU方言,如gnu89或GNU + 98。通過指定基本標準的 ,編譯器將接受遵循該標準的所有程序 ,並且那些使用不與 的GNU擴展相矛盾的程序。例如,-std = c89關閉了與ISO C90不兼容的GCC 的某些功能,例如「asm」和「typeof」 關鍵字,但不包含其他在ISO C90中沒有含義的GNU擴展,例如省略「?:」表達式的中間項。在 另一方面,通過指定標準的GNU方言,所有功能 支持編譯器啓用,即使這些功能更改基本標準的含義 和一些嚴格符合的程序可能會被拒絕。特定的標準被用於標識 ,鑑於該版本的標準,哪些特徵是GNU擴展。 例如std = gnu89 -pedantic會警告C++風格// 註釋,而-std = gnu99 -pedantic不會。

+0

除了二進制'?:'操作符之外,還有什麼可以幫助您?唯一想到的其他擴展,結構表達式,被C++ 11列表初始化取代。無論如何,這個引用主要涉及C而不是C++。 – Potatoswatter 2012-04-28 14:06:50

39

您可以檢查g++通過命令:

which g++ 
g++ --version 

這會告訴你哪個編譯器目前它指向。

切換到g++ 4。7(假設你已經在你的機器安裝了它),運行:

sudo update-alternatives --config gcc 

There are 2 choices for the alternative gcc (providing /usr/bin/gcc). 

    Selection Path    Priority Status 
------------------------------------------------------------ 
    0   /usr/bin/gcc-4.6 60  auto mode 
    1   /usr/bin/gcc-4.6 60  manual mode 
* 2   /usr/bin/gcc-4.7 40  manual mode 

然後選擇2作爲選擇(我的機器已經指向g++ 4.7,所以*)

一旦切換編譯然後再次運行g++ --version檢查交換是否正確發生。

現在用

g++ -std=c++11 your_file.cpp -o main 
+0

可能值得一提的是,像g ++ 4.4這樣的版本可能太老了,無法完成某些功能,所以升級是必要的。升級將取決於您的系統,我會避免自己編譯g ++的方法,並替換系統的編譯器以供參考 – 2016-08-30 18:07:56