g++版本4.0.0.8和4.3.2之间有什么区别?

6

g++ 4.0.0.8和g++ 4.3.2有什么区别?这两个编译器是我在各种编程比赛中看到使用最广泛的C++编译器。

我尝试过在谷歌上搜索,但没有找到相关信息。


5
详细了解结账 -> http://gcc.gnu.org/releases.html - DumbCoder
1
@DumbCoder 这是一个很长的列表。我只是想知道这两个版本之间是否有任何重大区别。像SPOJ这样的大多数在线编程比赛都有这两个C++版本,如果它们之间没有任何区别,那么SPOJ就只会有后者版本(即最新版本,就像其他编程语言编译器一样)。 - user553947
3个回答

13

考虑到你对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具有(包括来自GCC 4.1GCC 4.2的更改):

实验性支持ISO C++0x标准(这是一个链接)

  • long long现在在C++中已经正式支持(尽管在旧版GCC中它是一个提供的扩展)
  • 支持模板extern
  • 右尖括号,如std::vector<std::vector<int>>现在受支持(请注意声明末尾两个>之间没有空格)。
  • 可变模板参数的实验性支持
  • 静态断言
  • 还有其他一些

更多TR1库支持

  • <regex>(gcc 4.3),<random>(gcc 4.2)和<complex>(gcc 4.2)

C++可见性处理已进行全面改进。(GCC 4.2)

限制能见度会从类传递到成员,从函数传递到局部静态变量,从模板和模板参数传递到实例化,除非后者已经明确声明了可见性。
类的可见性属性必须放在类关键字和名称之间,而不是在闭合大括号之后。
现在允许为仅声明类型的枚举和 elaborated-type-specifiers 添加属性。
匿名命名空间的成员现在与使用它们的任何其他声明一起局部于特定的翻译单元,尽管它们在语言语义上仍被视为具有外部链接。
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上。
此外,请查看移植到GCC 4.3指南,其中包含一些重要内容,例如:
已删除向后兼容/弃用的头文件。
这主要意味着删除了一堆预标准头文件,例如<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

还进行了各种错误修复,以及我认为不会影响您编写竞赛代码的更改(例如移除/添加新的编译器标志),以及删除像<?>?运算符之类的东西(你曾经使用过这些吗?)。

总的来说,如果您必须为两个编译器编写代码,我不认为它们之间的差异会给您带来太多烦恼。


0

由于4.3.2比4.0.0.8更新更加符合标准。有关详细信息,您必须查看文档和发布更改


0
你想知道两个不同版本的g++之间的区别吗?它们是GNU C++编译器的两个常见版本。不同的Linux发行版可能会附带不同版本的g++。例如,我的当前CentOS 5.5附带了g++ 4.1.2。

如果你想了解更多功能细节,请查看你评论中的链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接