避免標頭檔案重複定義

licup123發表於2010-09-14
為什麼會出現類重複定義的錯誤呢?請讀者仔細檢視EX10.cpp檔案,在這個檔案中包含了animal.h和fish.h這兩個標頭檔案。當編譯 器編譯EX10.cpp檔案時,因為在檔案中包含了animal.h標頭檔案,編譯器展開這個標頭檔案,知道animal這個類定義了,接著展開fish.h 標頭檔案,而在fish.h標頭檔案中也包含了animal.h,再次展開animal.h,於是animal這個類就重複定義了。

  可以測試一下,如果我們多次包含iostream.h這個標頭檔案,也不會出現上面的錯誤。要解決標頭檔案重複包含的問題,可以使用條件預處理指令。修改後的標頭檔案如下:

  animal.h

  #ifndef ANIMAL_H_H       //我們一般用#define定義一個巨集,是為了在程式中使用,使程

  序更加簡潔,維護更加方便,然而在此處,我們只是為了判斷

  #define ANIMAL_H_H       ANIMAL_H_H是否定義,以此來避免類重複定義,因此我們沒有為

  其定義某個具體的值。在選擇巨集名時,要選用一些不常用的名字,

  class animal             因為我們的程式經常會跟別人寫的程式整合,如果選用一個很常用

  的名字(例如:X),有可能會造成一些不必要的錯誤

  {

  public:

  animal();

  ~animal();

  void eat();

  void sleep();

  virtual void breathe();

  };

  #endif

  fish.h

  #include "animal.h"

  #ifndef FISH_H_H

  #define FISH_H_H

  class fish:public animal

  {

  public:

  void breathe();

  };

  #endif

  我們再看EX10.cpp的編譯過程。當編譯器展開animal.h標頭檔案時,條件預處理指令判斷ANIMAL_H_H沒有定義,於是就定 義它,然後繼續執行,定義了animal這個類;接著展開fish.h標頭檔案,而在fish.h標頭檔案中也包含了animal.h,再次展開 animal.h,這個時候條件預處理指令發現ANIMAL_H_H已經定義,於是跳轉到#endif,執行結束。

  通過分析,我們發現在這次的編譯過程中,animal這個類只定義了一次。

  提示:Windows 2000初始安裝完畢後,對於已知檔案型別的副檔名是隱藏的,例如:“test.txt”這個檔案,在資源瀏覽器中看到的是“test”,在這種情況下,修改其檔名為“test.cpp”時,實際的檔名是“test.cpp.txt”,仍然是文字檔案。因此在Win2000下做開發時,要取消“隱藏已知檔案型別的副檔名”這一選項。

  操作步驟:在資源瀏覽器(或我的電腦)中,選擇選單中的“工具->資料夾選項(O)…”,選擇“檢視”標籤頁,將滾動欄拖到底端,將“隱藏已知檔案型別的副檔名”核取方塊中的對號(√)取消掉,單擊“確定”按鈕。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10697500/viewspace-673948/,如需轉載,請註明出處,否則將追究法律責任。

相關文章