考虑到您对两者之间的 C++ 变化感兴趣,这实际上并不是一个“巨大的列表”。
4.0.0.8 只是 4.0 的补丁版本,其发行说明如下:http://gcc.gnu.org/gcc-4.0/changes.html http://gcc.gnu.org/gcc-4.0/changes.html
4.3.2 是 4.3 的补丁版本,其发行说明如下:http://gcc.gnu.org/gcc-4.3/changes.html http://gcc.gnu.org/gcc-4.3/changes.html
如果您查看它们之间的差异,我认为以下列表涵盖了您真正关心的 GCC 4.0 和 4.3 之间最重要的差异。
GCC 4.3.2 有(包括来自GCC 4.1 http://gcc.gnu.org/gcc-4.1/changes.html and GCC 4.2 http://gcc.gnu.org/gcc-4.2/changes.html):
对 ISO C++0x 标准的实验支持 http://gcc.gnu.org/gcc-4.3/cxx0x_status.html(这是一个链接)
-
long long
现在在 C++ 中得到正式支持(尽管它是旧版 GCC 中提供的扩展)
- 模板
extern
支持
- 像您在中看到的那样的直角括号
std::vector<std::vector<int>>
现在支持(注意两者之间缺少空格)>
在声明的最后)。
- 对可变参数模板参数的实验支持 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf
- 静态断言 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html
- 和其他一些
更多 TR1 库支持
-
<regex>
(海湾合作委员会4.3),<random>
(海湾合作委员会4.2),以及<complex>
(海湾合作委员会4.2)
C++ 可见性处理已被彻底修改。 (海湾合作委员会4.2)
受限可见性从类传播到成员,从函数传播到局部静态变量,从模板和模板参数传播到实例化,除非后者已显式声明可见性。
类的可见性属性必须位于类键和名称之间,而不是在右大括号之后。
现在允许仅声明类型的枚举和详细类型说明符使用属性。
匿名名称空间的成员现在对于特定翻译单元以及使用它们的任何其他声明来说都是本地的,尽管它们仍然被视为具有语言语义的外部链接。
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 指南 http://gcc.gnu.org/gcc-4.3/porting_to.html,其中一些重要的内容,例如:
向后兼容/已弃用的标头已被删除。
大多数情况下,这意味着一堆预标准标头已被删除,例如<iostream.h>
(使用标准<iostream>
), <hash_map.h>
(use <tr1/unordered_map>
) <hashtable.h>
(use <tr1/unordered_map>
or <tr1/unordered_set>
取决于需要)等。同样,这没什么大不了的。
更严格执行标准
例如,签名main
的两个参数形式必须是正确的。
函数参数名称不能重复
void func(int x, int x); // now an error
并且有各种错误修复,以及我认为不会真正影响您编写竞赛代码的方式的更改(例如删除/添加新的编译器标志),以及删除诸如<?
and >?
运算符(曾经使用过那些吗?)。
总而言之,如果您必须为两个编译器编写代码,我认为两者之间的差异不会给您带来太多痛苦。