GCC 3.0印象记

GCC 3.0正式发布,重点改进包括支持使用using从基类引入成员函数,加强对嵌套类型存取控制的管理。然而,仍存在一些问题,如虚拟函数处理不当,嵌套类访问控制不足,以及函数指针转换的错误未完全修复。

      虫虫&beyond_ml
2001-6-18 GCC 3.0正式发布(http://gcc.gnu.org)。
从1999年4月开始,GCC的含义从GNU C Compiler变成了GNU Compiler Collection,支持C、C++、Objective C、Chill、Fortan和Java等语言。其中C++编译器G++当然是我们关注的焦点。从GCC网站的介绍中可以看出,G++作了不少改进,更好地支持C++标准。我们将选出相关的内容逐一评论。我们对GCC 3.0的总体印象是,有不少改进,但“革命尚未成功”,还得加把劲儿。
支持使用using从基类中引入成员函数
这是GCC老版本的一个大bug了。例如,下面这段程序虽然符合C++标准,但在以前版本的G++中不能被编译。
struct A
{
void f() {}
};
struct B: A
{
using A::f;
void f(int) {}
};

void main()
{
B b;
b.f();
}
在GCC 3.0中,这段程序就能够顺利通过了,可以算是一个进步。(编者注:GCC 3.0处理虚拟函数仍然失当,bug依旧,《钻穿牛角尖:using声明vs.虚函数》一文中有详细的分析。)
加强对嵌套类型的存取控制
看看这个程序。
class X
{
private:
????typedef int Y;
};


void main()
{
X::Y a;
}
按标准,这样的程序显然是错误的,X::Y不可访问。然而在GCC 2.9x上却能编译通过。GCC 3.0加强了对嵌套类型的管理,这个问题已经不复存在。
下面这段程序来自C++标准ISO/IEC 14882第184页。
class C
{
class A{};
A *p;
class B : A
{
A*q;
C::A*r; //error
B*s;
C::B????*t; //error
};
};
标记为error的两行按标准应该出错,然而在GCC 2.9x和3.0上均编译通过,可见GCC对嵌套类的访问控制还不尽如人意。
改进了名字粉碎机制
这是编译器编译、连接的具体实现,我们就不做测试了。
某些以前可以编译通过的无效转换现在都将被拒绝
在帮助文件里特别提到了函数指针的转换,GCC 3.0比以前更为严格。可惜我们没有发现好的例子。不过以前函数指针转换的一个大bug,现在依然没有修复。
#include
template void test(C f) {}
void main()
{
test(&std::vector::push_back);
}
上面class C代表的是一个模板类的成员函数指针。在GCC 2.9x和GCC 3.0中,我们都会得到'no matching function for call to `test ({unknown type})'的编译错误,而这是一个正确的程序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值