我是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和头文件所需的路径是否位于同一个文件夹中?在发布主文件的代码之间。 –