C++ redefintion?

當我繼承一個含有virtaul function的class,

被繼承的class有include 某個header當,該header檔,也有用 #ifndef 來避免被重覆include.

但,我在 derived class中也include 該 header檔,然後compiler,就會出現redefintion的錯誤..關於這點我覺得很怪,我明明就有用 #ifndef 處理過了,理論上應該不會有redefine的問題,

我知道如何解決這樣的問題,我想了解是為何會發生這樣的狀態?

我是有點懷疑是因為要實現RTTI的機制,所以才會我這個超乎我預期的狀態發生?.

抑或是compiler 的問題 (雖然是不太可能拉)

使用版本 GCC 4.4.4

OS: Linux

2 個解答

評分
  • novus
    Lv 6
    9 年前
    最佳解答

    這樣子太籠統了,我大概可以想到兩三種情形,不過沒看到程式和錯誤訊息說不得準。

    被判為 redefine 的,究竟是class本身?全域物件?函數實作?還是其他的東西?

    是在編譯期被抓到,還是連結期才抓到?

    我想比較有可能發生的是你誤解了#ifndef include guard 的意義,include guard 最多只能確保單一個 compilation unit 之內不會重複引入同一個 header,但對於多個 compilation unit 重複引入則無能為力。

    另外你可以透過 gcc -E 來查看 #include 展開後的 compilation unit 長怎麼樣

    2011-11-24 17:49:28 補充:

    通常的情形是 base 和 derived 的實作檔都引入了同一個 header,這個 header 包含了定義的的東西,那麼即使 header 當中有 include guard 也沒辦法防止定義分別出現在兩個不同的compilation unit。

    很多人沒有真正明白 preprocessor 意義,所以會對 include guard 產生誤解。其實從compilation unit的角度來看一切都很單純

    2011-11-24 21:10:04 補充:

    我想比較有可能發生的是你誤解了#ifndef include guard 的意義,include guard 最多只能確保單一個 compilation unit 之內不會重複引入同一個 header,但對於多個 compilation unit 重複引入則無能為力。

    另外你可以透過 gcc -E 來查看 #include 展開後的 compilation unit 長怎麼樣

    通常的情形是 base 和 derived 的實作檔都引入了同一個 header,這個 header 包含了定義,即使 header 當中有 include guard 也沒辦法防止同一個定義分別出現在兩個不同的 compilation unit。

    很多人沒有真正明白 preprocessor 意義,所以會對 include guard 產生誤解。其實從 compilation unit 的角度來看一切都很單純。

    ※ 希望以後在可行的情況下盡量提供「能重現問題的最小程式碼」以及錯誤類型,這樣大家比較快進入狀況

  • 9 年前

    您的意思是當base class和 derived class分屬於不同的檔案,

    在編譯的過程中,derived class 其實是無法檢查到 base class的preprocessor嗎?

    因為對於 base class 和 derived class 而言,他們是分屬於不同的compilation unit.

    所以就算有用#ifndef include guard,亦有可能會發生redefine的問題.

    不知道我有沒有誤會您的意思?

    2011-11-24 19:44:24 補充:

    非常感謝您的答案

    煩請移往回答區,以便分享..謝謝

還有問題?馬上發問,尋求解答。