不要轻忽编译器的警告

       很多程序员日常总是不理睬编译器警告。毕竟,如果问题很严重,就会是个错误,不是吗?这种想法在其它语言中相对来说没什么害处,但在C++中,可以肯定的一点是,编译器的设计者肯定比你更清楚到底发生了什么。例如,大家可能都犯过这个错误:

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

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

这里是想用D::f重新定义virtual函数B::f,但其中有个错误:B中的f是个const成员函数,而在D中它未被声明为const。我手上的一个编译器于是这样说话了:

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

        对于这条警告,很多缺乏经验的程序员会这样自言自语,"D::f当然会隐藏B::f ---- 本来就应该是这样!" 错了。编译器想告诉你的是:声明在B中的f没有在D中重新声明,它被完全隐藏了(参见条款50:为什么这样)。忽视这条编译器警告几乎肯定会导致错误的程序行为。你会不停地调试去找原因,而这个错误实际上早就被编译器发现了。

        当然,在对某个编译器的警告信息积累了经验之后,你会真正理解不同的信息所表示的含义(唉,往往和它们表面看上去的意思不同)。一旦有了这些经验,你会对很多警告不予理睬。这没问题,但重要的是,在忽略一个警告之前,你一定要准确理解它想告诉你的含义。

 

请记住

严肃对待编译器发出的警告信息,努力在你的编译器的最高(最严苟)警告级别下争取“无任何警告”的荣誉。

不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同,一旦移植到另一个编译器上,你原本依赖的警告消息有可能消失。

你可能感兴趣的:(不要轻忽编译器的警告)