chenjcc的个人博客分享 http://blog.sciencenet.cn/u/chenjcc

博文

最新版C语言编译器刚一上市,就问题多多

已有 4485 次阅读 2013-5-12 12:30 |个人分类:技术交流|系统分类:科研笔记

今年3月23日gcc推出4.8.0,这是一个较为全面支持C++11标准的编译器。最近几天试着用了这个新版本。在低版本Linux环境下,装gcc-4.8.0很容易失败。在较高版本Linux环境下,装gcc-4.8.0没有遇到困难。据悉,gcc-4.8.0不仅编译出来的程序速度快,还能克服以前的版本如 gcc-4.5.2存在的错误(bug)。关于gcc-4.5.2的错误,详细报道见:https://groups.google.com/forum/?fromgroups=#!topic/minisat/YHEWCFqxyFg

不过最近新版本的使用感觉有点不爽,发现它与以前的版本有点不兼容。自从gcc问世以来,各个版本之间的兼容性问题就不断为人诟病。然而,最近的这个不兼容性还是让我感到很意外。比如说,早期的版本从输入流读入一个布尔型的数据已经不是一个问题,但gcc-4.8.0就没有按照以前gcc的理解去编译。假如以标准的输入流类为基础定义了如下一个类:

           class input_stream : public std::basic_istream<char, Traits> {.....}

然后定义一个对象input_stream str(…) 和一个变量 bool b, str>>b输入布尔值。如果输入流中当前字符为'0'或'1',早期的版本读入后指针会自动往下挪一格,但gcc-4.8.0不是挪一格,而是直接指向 0xffffffff,也就是说它没有正确编译这类功能的语句。

 新版本的第二个不兼容性表现在对类中非成员的静态变量的理解上。我们用下面一段程序来看看旧版本和新版本之间的差异。

class A{

     public:

     void f()

     {  static int x;

        x++;

        cout<<x<<''

     }

};

void g() { A a; a.f();}

main()

{   g( );

   g( );

}

旧版本的执行结果为:1、1、, 而新版本的执行结果为:1、2、。旧版本为每一个对象生成一个静态变量x,但新版本不这样做,它总共只生成一个静态变量x,即后面的对象会共享前面的静态变量,这有点类似静态数据成员的味道。

  新老版本的第三个差异表现在新版本不再想老版本那样,可以不经声明就可以直接调用某些标准库函数,如printf等。

  新老版本的第四个异同点是新版本去掉了对某些标准库函数的支持,调用_exit()被新版本认为是错误的

  短短几天,我总共找到了上述四种差异,估计还有更多的差异还未被挖掘出来。我只知道新版本主要用于支持C++11下列功能:

  1. 自动定义变量类型,如auto found = lower_bound(p.begin(), p.end(), 1);

  2. 自动获取向量中每一个元素,如: 

    vector<int> v;

    for (int x: v)

    for_each(v.begin(),v.end(),print);

  3. 匿名函数

但不知道gcc-4.8.0在传统功能上做过什么改进,也不知道上述改动算不算它的失误。不管怎样,过多地改动传统功能上的语义,会给软件开发人员增加很大的维护负担。

 

                                                          2013-05-12

 



https://blog.sciencenet.cn/blog-788889-689104.html

上一篇:功利主义不是阻碍科学研究的罪魁祸首
下一篇:开放存取期刊与学霸是一根藤上的两个瓜,都靠敛财为生
收藏 IP: 58.38.190.*| 热度|

2 文克玲 李宇斌

该博文允许注册用户评论 请点击登录 评论 (4 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-23 05:04

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部