||
今年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下列功能:
自动定义变量类型,如auto found = lower_bound(p.begin(), p.end(), 1);
自动获取向量中每一个元素,如:
vector<int> v;
for (int x: v)
for_each(v.begin(),v.end(),print);
匿名函数
但不知道gcc-4.8.0在传统功能上做过什么改进,也不知道上述改动算不算它的失误。不管怎样,过多地改动传统功能上的语义,会给软件开发人员增加很大的维护负担。
2013-05-12
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 05:04
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社