哪一個版本的gcc才支持c11

而知,低版本的gcc不支持c11。html

(而我此處的eglibc 2.17,和那人的glibc-2.16.0,都是須要支持c11的gcc的)ios

因此此處想要去搞清楚,什麼版本的,哪一個版本的,gcc,才支持c11。c++

【解決過程】git

1.google搜:github

gcc c11編程

就能夠看到:ubuntu

2 Language Standards Supported by GCCapp

而明白:編程語言

  • C89=C90:gcc選項是:-ansi, -std=c90 or -std=iso9899:1990;
    • 帶了GNU擴展的:-std=gnu90
  • C94=C95:gcc選項:-std=iso9899:199409
  • C99:gcc選項:-std=c99 or -std=iso9899:1999
    • 未完成C99標準以前,叫作C9X
    • 帶了GNU擴展的:-std=gnu99
  • C11:gcc選項是-std=c11 or -std=iso9899:2011
    • 未完成C11標準以前,叫作C1X
    • 帶了GNU擴展的:-std=gnu11

2.後來找到:學習

How to enable c11 on later versions of gcc?

可知:

gcc 4.7

以後,才支持c11.

3.參考:

C11Status

得知:

-std=c1x GCC 4.6

-std=c11 GCC 4.7

uchar.h Library issue (glibc 2.16)

 

【總結】

gcc是到了4.7,才真正支持c11的。

 

  C++11,(即ISO/IEC 14882:2011),是目前的C++編程語言的最新正式標準。它取代了第二版標準(初版公開於1998年,第二版於2003年更新,分別通稱C++98以及C++03,二者差別很小)。新的標準包含核心語言的新機能,並且擴展C++標準程序庫。C++11新標準由C++標準委員會於2011年8月12日公佈,並於2011年9月出版。這次標準爲C++98發佈後13年來第一次重大修正。

    像C++這樣的編程語言,經過一種演化的的過程來發展其定義。這個過程不可避免地將引起與現有代碼的兼容問題,在C++的發展過程當中偶爾會發生。不過根據Bjarne Stroustrup(C++的創始人而且是委員會的一員)表示,新的標準將幾乎100%兼容於現有標準。關於C++11的新特性和一些版本變動請看:C++11-維基百科

    目前最新版本的GCC/G++是4.8,新版本的GCC支持最新的C++11標準,十分值得去使用&學習。 下面讓咱們在Ubuntu12.04 LTS用上GCC最新版本,去體驗C++11新標準帶來的東西吧!

首先非源碼編譯式安裝:

 

[c++] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. sudo add-apt-repository ppa:ubuntu-toolchain-r/test  
  2. sudo apt-get update  
  3. sudo apt-get install gcc-4.8   
  4. sudo apt-get install g++-4.8  


等GCC/G++下載並安裝完之後,測試是否安裝成功:

 

 

[c++] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. gcc-4.8 -v  
  2. g++-4.8 -v  

若是顯示版本號表示安裝成功:

安裝成功後咱們若是要使用gcc-4.8和g++-4.8來編譯的話,咱們就得把gcc改成gcc-4.8,g++同理,改成g++-4.8來進行編譯。

此時使用gcc -v查看默認版本,爲4.6版本:

 

若是你想直接使用gcc-4.8而不改變編譯時gcc改成gcc-4.8的話,咱們就能夠更改一下gcc的軟連接:

 

[c++] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. sudo rm /usr/bin/gcc  
  2. sudo ln -s /usr/bin/gcc-4.8 /usr/bin/gcc  
  3. sudo rm /usr/bin/g++  
  4. sudo ln -s /usr/bin/g++-4.8 /usr/bin/g++  

如今咱們用gcc -v來測試就能發現變爲了4.8了!

 

 

既然GCC-4.8使用了最新的C++11標準,可是咱們爲何仍是提示錯誤呢?解決方法以下:
在編譯的時候添加-std=c++11選項便可正常編譯C++11標準的代碼!

 

咱們能夠寫一個簡單的例子來測試,這裏用的是C++11新標準的範圍for(Range for)語句,用來遍歷給定序列中的每一個元素:

 

[cpp] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. /************************************************************************* 
  2.     > File Name: test.cpp 
  3.     > Author: SongLee 
  4.     > E-mail: lisong.shine@qq.com  
  5.     > Created Time: 2014年03月23日 星期日 22時29分19秒 
  6.     > Personal Blog: http://songlee24.github.io/ 
  7.  ************************************************************************/  
  8. #include<iostream>  
  9. #include<cstring>  
  10. #include<cctype>  
  11. using namespace std;  
  12.   
  13. int main()  
  14. {  
  15.     string str("some string");  
  16.     // range for 語句  
  17.     for(auto &c : str)  
  18.     {  
  19.         c = toupper(c);  
  20.     }  
  21.     cout << str << endl;  
  22.     return 0;  
  23. }  

上面的程序使用Range for語句遍歷一個字符串,並將全部字符所有變爲大寫,而後輸出。其中auto類型也是C++11新標準中的,用來自動獲取變量的類型。

好了,接下來進行編譯運行:

 

[cpp] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. g++ -o test test.cpp  


 

提示錯誤:‘c’變量沒有類型,範圍for循環不容許在C++98標準中使用

這是由於GCC/G++默認的-std(即C++語言標準)不是C++11,在這裏默認的是C++98,因此須要顯式地開啓,即添加-std=c++11選項:

 

[cpp] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. g++ -std=c++11 -o test test.cpp  


 

編譯成功!!!運行之後輸出some string的大寫形式!

相關文章
相關標籤/搜索