多个包含错误

时间:2013-11-21 06:58:45

标签: c++ include ifndef

我是C ++的新手,我正在尝试包含两个.h文件。包括相互访问,因此根据我将它们包含在一个失败或另一个中的顺序。因此,我知道唯一可能的问题是当我去编译“$ g ++ main.cpp foo1.cpp foo2.cpp”并且它无法读取它时。我使用了#IFnDef,因为我看到了修复了另一篇文章的问题,但它没有改变我的任何内容。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

正如您所见,您不能让两个标题相互包含。请记住,#include指令基本上意味着“获取该文件的内容并假装它粘贴在此处”。如果header1.h表示在开头包含header2.h的内容,但header2.h表示在开头包含header1.h的内容,header1.h表示({1}}再次)在开始时加入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 的类存在;它不需要知道它的成员。)