C ++头文件和编译过程

时间:2017-01-30 17:51:38

标签: c++ compilation header-files

我对c ++头文件及其包含有疑问。

请考虑以下情况。

我在里面有以下文件和代码:

A.H

class A
{
    // ...
};

A.cpp

#include "A.h"

// implementation of A

B.h

class B
{
    A object;
}

B.cpp

 #include "A.h"

 #include "B.h"

 /// implementation of B

当我尝试构建时,编译器会在B.h中出错,因为我没有包含A.h。

问题是为什么编译器单独编译头文件,如果它们包含在某些cpp文件中并且包含预处理器正在复制/粘贴头文件的完整内容,并且头文件内容将使用cpp文件编译,其中包含它。

2 个答案:

答案 0 :(得分:1)

如果B.h需要A.h,你应该将A.h包括在B.h中,因为你不能假设每次包括B.h,A.h将被包含在之前。

当然,如果你只是将A.h包含在B.h中,你将会解析A.h两次(或更多),所以重复的定义和一堆错误,这就是为什么你还必须包括标题保护。有关标题保护的说明,请参阅C++ #include guards

答案 1 :(得分:0)

您可以对两个.h文件使用标头保护结构:

#ifndef FILE_A_H
#define FILE_A_H

/*Your header*/

#endif

除此之外,您可以在主标题中添加该类的声明。