我是 C++ 新手,正在尝试包含我制作的两个 .h 文件。包括相互访问,因此取决于我将它们包含在一个失败或另一个中的顺序。因此,我知道唯一可能的问题是当我去编译“$ g++ main.cpp foo1.cpp foo2.cpp”并且它无法读取一个。我使用#IFnDef 是因为我看到它在另一篇文章中解决了这个问题,但它对我没有任何改变。有任何想法吗?
问问题
2903 次
1 回答
2
如您所见,您不能让两个标题相互包含。请记住,#include
指令基本上意味着“获取该文件的内容并假装它已粘贴在此处”。如果header1.h
说header2.h
在开头包含内容,但header2.h
说在开头包含内容header1.h
,并header1.h
说(再次)header2.h
在开头包含……你明白了。
#define
/#ifndef
技巧(称为“包含保护”)通过只允许每个标头包含一次来避免无限递归,但这意味着编译器将看到 的内容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
中不需要 include header2.h
,因为它不需要class的定义Foo
,只需要一个声明。(换句话说,编译器只需要知道一个名为Foo
exists的类;它还不需要知道它的成员。)
于 2013-11-21T07:21:46.250 回答