【问题标题】:Multiple include error多个包含错误
【发布时间】:2013-11-21 06:58:45
【问题描述】:

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

【问题讨论】:

  • 你通常只需要一个前向声明并且包含整个文件是浪费编译器的工作。
  • 让两个文件相互包含不是一个好主意。要么将这两个文件合并为一个,要么使用前向声明,以便至少一个文件不需要包含另一个文件。如果您需要前向声明方面的帮助,那么您将不得不发布代码。
  • 检查头文件的路径或需要的 main.cpp 和头文件都位于同一文件夹中?。在发布您的主文件代码之间。

标签: c++ include ifndef


【解决方案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 的类存在;它还不需要知道它的成员。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2021-06-13
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多