《Effective C++》学习笔记(条款53:不要轻忽编译器的警告)

最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!

许多程序员习惯性的忽略编译器的警告。他们认为,如果问题很严重,那么编译器应该给一个错误而不是警告。这种想法在C++是不可取的,以一个例子来说明:

class B{
public:
    virtual void f() const;
};
class D: public B{
public:
    virtual void f();
};

这里希望 D::f()重新定义 虚函数 B::f(),但其中有个错误,B::f() 是个 const成员函数,而 D 不是。编译器不会报错,可能会给如下警告:

warning: D::f() hides virtual B::f()

经验不足的程序员认为这是 D::f 遮掩了 B::f 。这是错的,编译器是在告诉你声明于 B 中 的 f 并未在 D 中被重新声明,而是被整个遮掩了(条款33解释为什么会这样)。如果忽略这个警告,几乎肯定导致错误的程序行为,然后为了找出这个编译器已经告诉你的错误而进行许多调试。

一旦从编译器的警告信息中获得经验,你将学会了解不同的警告信息意味什么,那往往和它们“看起来“的意义并十分不同。一般认为,写出一个在最高警告级别下也没有任何警告信息的程序是最理想的,然而你一旦对警告信息有了深刻理解,可以选择忽略某些警告信息。但是一定记住在忽略这个警告之前,一定要了解它的真正意义。

警告信息和编译器相依,不同的编译器有不同的警告标准。所以,草率编程然后倚赖编译器为你指出错误的行为并不可取。例如上面代码中的函数遮掩在另一个编译器中编译,可能没有任何警告。

Note:

  • 严肃对待编译器发出的警告信息。努力在你的编译器最高警告级别下争取”无任何警告“
  • 不要过度依赖编译器的报警能力,因为不同编译器对待事情的态度并不相同。一段有警告的代码,移植到另一个编译器上,可能没有任何警告
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值