【學習】【Effective C++】條款48: 重視編譯器警告

來源:互聯網
上載者:User

譯者:lostmouse

很多程式員日常總是不理睬編譯器警告。畢竟,如果問題很嚴重,就會是個錯誤,不是嗎?這種想法在其它語言中相對來說沒什麼害處,但在C++中,可以肯定的一點是,編譯器的設計者肯定比你更清楚到底發生了什麼。例如,大家可能都犯過這個錯誤:

   1:  class B {
   2:  public:
   3:    virtual void f() const;
   4:  };
   5:   
   6:  class D: public B {
   7:  public:
   8:    virtual void f();
   9:  };
  10:   
本來是想用D::f重新定義虛函數B::f,但有個錯誤:在B中,f是一個const成員函數,但在D中沒有被聲明為const。據我所知,有個編譯器會這麼說:
warning: D::f() hides virtual B::f()

對於這條警告,很多缺乏經驗的程式員會這樣自言自語,"D::f當然會隱藏B::f ---- 本來就應該是這樣!" 錯了。編譯器想告訴你的是:聲明在B中的f沒有在D中重新聲明,它被完全隱藏了(參見條款50:為什麼這樣)。忽視這條編譯器警告幾乎肯定會導致錯誤的程式行為。你會不停地調試去找原因,而這個錯誤實際上早就被編譯器發現了。

當然,在對某個編譯器的警告資訊積累了經驗之後,你會真正理解不同的資訊所表示的含義(唉,往往和它們表面看上去的意思不同)。一旦有了這些經驗,你會對很多警告不予理睬。這沒問題,但重要的是,在忽略一個警告之前,你一定要準確理解它想告訴你的含義。

只要談到警告,就要想到警告是和編譯器緊密相關的,所以在編程時不要馬馬虎虎,寄希望於編譯器為你找出每一條錯誤。例如上面隱藏了函數的那段代碼,當它通過不同的(但使用很廣泛的)編譯器時可能不會產生警告。編譯器是用來將C++轉換成可執行格式的,並不是你的私人保鏢。你想得到那樣的安全?去用Ada吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.