g ++ 4.0.0.8和g ++ 4.3.2有什么区别?这两个是我在各种编程竞赛中使用过的最常见的C ++编译器。
我试图谷歌,但没有找到。
答案 0 :(得分: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.1和GCC 4.2的更改):
Experimental support for the ISO C++0x standard (这是一个链接)
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)
受限制的可见性从类传播到成员,从函数传递到局部静态,从模板和模板参数传播到实例化,除非后者明确声明了可见性。
类的visibility属性必须介于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.
此外,请查看porting to GCC 4.3 guide,其中包含一些重要内容,例如:
已删除向后兼容/已弃用的标头。
大多数情况下,这意味着已删除了一堆预标准标头,例如<iostream.h>
(使用标准<iostream>
),<hash_map.h>
(使用<tr1/unordered_map>
){{1 (根据需要使用<hashtable.h>
或<tr1/unordered_map>
)等等。再次,这不是什么大问题。
严格执行标准
例如,<tr1/unordered_set>
的双参数形式的签名必须正确。
没有重复的函数参数名称
main
还有各种错误修复,以及我认为不会影响您如何编写竞争代码(如删除/添加新编译器标志)以及删除{{1}之类的内容的更改}和void func(int x, int x); // now an error
运算符(曾经使用过那些?)。
总而言之,如果您不得不为两个编译器编写代码,我认为两者之间的差异不会让您感到悲伤。
答案 1 :(得分:0)
你想知道两个不同版本的g ++之间的区别吗?它是GNU C ++编译器的两个常见版本。不同的Linux版本可能附带不同版本的g ++。就像我现在的CentOS 5.5有g ++ 4.1.2一样。
有关功能详情,请查看评论中的链接。
答案 2 :(得分:0)
由于4.3.2比4.0.0.8更新,因此它更符合标准。有关详细信息,您必须检查文档和发布更改