g++ 4.0.0.8和g++ 4.3.2有什么区别?这两个是我在各种编程竞赛中见过的最常用的C++编译器。
我试着用谷歌搜索了一下,但什么也没找到。
发布于 2010-12-31 02:27:39
考虑到你对两者之间的C++变化感兴趣,这真的不是一个“巨大的列表”。
4.0.0.8只是4.0的补丁版本,其发行说明在这里:http://gcc.gnu.org/gcc-4.0/changes.html
4.3.2是4.3的补丁修订版,其发行说明在此处:http://gcc.gnu.org/gcc-4.3/changes.html
如果你看一下它们之间的区别,我认为下面的列表涵盖了你真正关心的GCC 4.0和4.3之间最重要的区别。
GCC 4.3.2具有(包括对 和 ):的更改
(这是一个链接)
long long现在在C++中得到了正式支持(尽管它是在较早的GCC中提供的一个扩展),但现在支持尖括号,就像你在std::vector<std::vector<int>>中看到的那样(请注意,在declaration).的末尾,两个>之间缺少空格
更多TR1库支持
<regex> (gcc 4.3)、<random> (gcc 4.2)和<complex> (gcc 4.2)对C++可见性处理进行了全面检查。(GCC 4.2)
受限可见性从类传播到成员,从函数传播到局部静态,从模板和模板参数传播到实例化,除非后者显式声明了可见性。
类的可见性属性必须在class-key和name之间,而不是在右大括号之后。
现在,只声明类型的枚举和复杂类型说明符允许使用属性。
匿名命名空间的成员现在是特定翻译单元的本地成员,以及使用它们的任何其他声明,尽管它们仍然被视为语言语义的外部链接。
是一个没有文档记录的模板扩展,在GCC 4.2中被删除(4.1中弃用)
,允许带有默认参数的模板绑定到带有较少参数的模板模板参数的(未记录的)扩展已被删除。例如:
template <template <typename> class C>
void f(C<double>) {}
template <typename T, typename U = int>
struct S {};
template void f(S<double>); G++不再接受
。此代码不被接受的原因是,S是一个具有两个参数的模板;因此,它不能绑定到只有一个参数的C。
此外,请查看 ,其中包含一些重要的内容,例如:
已删除向后兼容/不推荐使用的标头。
大多数情况下,这意味着一些标准的头文件被删除了,比如<iostream.h> (使用标准的<iostream>)、<hash_map.h> (使用<tr1/unordered_map>)、<hashtable.h> (根据需要使用<tr1/unordered_map>或<tr1/unordered_set> )等等。
更严格地执行标准
例如,main的双参数形式上的签名必须是正确的。
无重复的函数参数名称
void func(int x, int x); // now an error已经有了各种各样的错误修复,以及我认为不会真正影响你编写竞争代码的变化(比如删除/添加新的编译器标志),以及像<?和>?操作符这样的东西的删除(使用过这些吗?)。
总而言之,如果你不得不为两个编译器都写代码,我认为两者之间的差异不会给你带来太多痛苦。
发布于 2010-12-30 22:47:51
您想知道两个不同版本的g++之间的区别吗?它是GNU C++编译器的两个常见版本。不同的Linux版本可能附带不同版本的g++。就像我现在的CentOS 5.5一样,它有g++ 4.1.2。
有关功能的详细信息,请查看评论中的链接。
发布于 2010-12-31 02:04:45
由于4.3.2版本比4.0.0.8版本更新,因此更符合标准。有关详细信息,请查看文档和版本更改
https://stackoverflow.com/questions/4563340
复制相似问题