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

6 c++

g ++ 4.0.0.8和g ++ 4.3.2有什么区别?这两个是我在各种编程竞赛中使用的最常见的C++编译器.

我试着谷歌,但没有发现任何东西.

wkl*_*wkl 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>>现在支持你所看到的直角括号(请注意>声明末尾两者之间没有空格).
  • Variadic模板参数的实验支持
  • 静态断言
  • 和其他一些人

更多TR1库支持

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

C++可见性处理已经过彻底改革.(GCC 4.2)

受限制的可见性从类传播到成员,从函数传递到局部静态,从模板和模板参数传播到实例化,除非后者明确声明了可见性.

类的visibility属性必须位于类键和名称之间,而不是在右大括号之后.

现在允许枚举和仅声明类型的详细类型说明符的属性.

匿名命名空间的成员现在是特定翻译单元的本地成员,以及使用它们的任何其他声明,尽管它们仍然被视为具有语言语义的外部链接.

在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>);   
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

并且已经有各种错误修复,以及我认为不会真正影响您如何编写竞争代码(如删除/添加新编译器标志)以及删除诸如<?>?运算符之类的内容的更改(曾经使用过那些? ).

总而言之,如果你不得不为两个编译器编写代码,我不认为这两者之间的差异会让你感到非常悲伤.