哪个版本的gcc才支持c11

linux soft install and command 专栏收录该内容
56 篇文章 0 订阅

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

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

所以此处想要去搞清楚,什么版本的,哪个版本的,gcc,才支持c11。

【解决过程】

1.google搜:

gcc c11

就可以看到:

2 Language Standards Supported by GCC

而明白:

  • 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的大写形式!





  • 4
    点赞
  • 3
    评论
  • 9
    收藏
  • 扫一扫,分享海报

评论 3 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值