2013-11-21 39 views
1

我是C++的新手,並試圖包含兩個我製作的.h文件。這些包括訪問彼此,這取決於順序我將它們包括在一個失敗或另一個。正因爲如此,我知道唯一可能的問題是編譯「$ g ++ main.cpp foo1.cpp foo2.cpp」並且無法讀取它。我使用了#IFnDef,因爲我發現這個問題解決了另一篇文章,但它並沒有改變我的任何內容。有任何想法嗎?多個包含錯誤

+0

您經常只需要一個前向聲明幷包含整個文件浪費編譯器的工作量。 – chris

+0

有兩個文件包含對方不是一個好主意。要麼將兩個文件合併爲一個文件,要麼使用前向聲明,以便至少有一個文件不需要包含另一個文件。如果您需要轉發聲明的幫助,那麼您將不得不發佈代碼。 – john

+0

檢查頭文件或main.cpp和頭文件所需的路徑是否位於同一個文件夾中?在發佈主文件的代碼之間。 –

回答

1

正如你所看到的,你不能有兩個頭包含對方。請記住,#include指令基本上意味着「獲取該文件的內容並假裝它被粘貼在這裏」。如果header1.h開頭說包括header2.h的內容,但header2.h開頭說包含header1.h的內容,而header1.h說(包括header2.h在開始處),你會發現這個想法。

#define/#ifndef特技(稱爲「include guard」)避免通過只允許被包括一次每個標題無限遞歸,但是這意味着,編譯器將看到任一header1.h隨後的header2.h,或副內容的內容反之亦然。如果每個頭文件中的代碼都依賴於另一個頭文件中定義的內容,那麼無論哪種方式,代碼都會引用直到後來才定義的內容。

您可能能夠避免使用什麼叫做「前進宣言」的循環依賴 - 聲明東西,將無法完全定義直到後來。例如:

// header1.h 
#ifndef HEADER1_H 
#define HEADER1_H 

class Foo; // Declaration only 

class Bar { // Definition 
private: 
    // You can have a pointer to a type that's only declared, not defined. 
    Foo *p_foo; 

    // ... 
}; 

#endif // ndef HEADER1_H 

---- 

// header2.h 

#ifndef HEADER2_H 
#define HEADER2_H 

#include "header1.h" 

class Foo { // Definition 
private: 
    // This requires class Bar to be defined, but that's OK, because it is. 
    Bar bar; 

    // ... 
}; 

#endif // ndef HEADER2_H 

在這個例子中header1.h沒有包括header2.h,因爲它不需要Foo類的定義,只是一個聲明。 (換句話說,編譯器只需要知道一個名爲Foo的類是否存在;它不需要知道其成員呢。)