2013-11-21 41 views
1

我是C++的新手,并试图包含两个我制作的.h文件。这些包括访问彼此,这取决于顺序我将它们包括在一个失败或另一个。正因为如此,我知道唯一可能的问题是编译“$ g ++ main.cpp foo1.cpp foo2.cpp”并且无法读取它。我使用了#IFnDef,因为我发现这个问题解决了另一篇文章,但它并没有改变我的任何内容。有任何想法吗?多个包含错误

+0

您经常只需要一个前向声明并包含整个文件浪费编译器的工作量。 – chris

+0

有两个文件包含对方不是一个好主意。要么将两个文件合并为一个文件,要么使用前向声明,以便至少有一个文件不需要包含另一个文件。如果您需要转发声明的帮助,那么您将不得不发布代码。 – john

+0

检查头文件或main.cpp和头文件所需的路径是否位于同一个文件夹中?在发布主文件的代码之间。 –

回答

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的类是否存在;它不需要知道其成员呢。)