《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:

  • 严肃对待编译器发出的警告信息。努力在你的编译器最高警告级别下争取”无任何警告“
  • 不要过度依赖编译器的报警能力,因为不同编译器对待事情的态度并不相同。一段有警告的代码,移植到另一个编译器上,可能没有任何警告

猜你喜欢

转载自blog.csdn.net/qq_34168988/article/details/121579318