我是C++的新手,並試圖包含兩個我製作的.h文件。這些包括訪問彼此,這取決於順序我將它們包括在一個失敗或另一個。正因爲如此,我知道唯一可能的問題是編譯「$ g ++ main.cpp foo1.cpp foo2.cpp」並且無法讀取它。我使用了#IFnDef,因爲我發現這個問題解決了另一篇文章,但它並沒有改變我的任何內容。有任何想法嗎?多個包含錯誤
Q
多個包含錯誤
1
A
回答
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
的類是否存在;它不需要知道其成員呢。)
相關問題
- 1. 結果包含多個行錯誤mysql
- 2. 錯誤:序列包含多個元素
- 3. Angular 2:多個包含錯誤
- 4. set_error_handler包含錯誤的多個回聲
- 5. 的JavaCC Eclipse的包含多個錯誤
- 6. MiXiM包含錯誤
- 7. Fmod包含錯誤
- 8. PHP包含錯誤
- 9. PHP包含錯誤
- 10. 包裝VHDL包含錯誤
- 11. 350多個錯誤:類型'blah.blah.blah'已經包含一個定義?
- 12. 多個SSIS包錯誤
- 13. 錯誤SLF4J:類路徑包含多個SLF4J綁定jenkins cobertura maven
- 14. 批次刪除時Entityframework.extensions錯誤「序列包含多個元素」
- 15. 'Rank'維包含多個層次結構錯誤
- 16. VS2013 - 多個包含相同標題的錯誤
- 17. 錯誤號:1172結果包含多個行
- 18. 類路徑中包含多個SLF4J綁定錯誤
- 19. 錯誤1172:結果包含多個行(在SQL中)
- 20. LINQ .FromSQL錯誤InvalidOperationException:序列包含多個匹配元素
- 21. 錯誤:SLF4J:類路徑中包含多個SLF4J綁定
- 22. 使用union時.c包含文件中的多個錯誤
- 23. Web應用程序錯誤:序列包含多個元素
- 24. 包含在多個文件中時std :: function對象有多個定義錯誤?
- 25. PHP包含顯示錯誤
- 26. 包含404錯誤頁面
- 27. CUDA Makefile包含錯誤
- 28. 包含錯誤:sqlfront.h&sqldb.h
- 29. QStringList包含拋出錯誤
- 30. 要求/包含錯誤PHP
您經常只需要一個前向聲明幷包含整個文件浪費編譯器的工作量。 – chris
有兩個文件包含對方不是一個好主意。要麼將兩個文件合併爲一個文件,要麼使用前向聲明,以便至少有一個文件不需要包含另一個文件。如果您需要轉發聲明的幫助,那麼您將不得不發佈代碼。 – john
檢查頭文件或main.cpp和頭文件所需的路徑是否位於同一個文件夾中?在發佈主文件的代碼之間。 –