C ++标题包含

时间:2013-08-31 14:19:28

标签: c++ header include

我正在开发一个项目,每个头文件都有一个预处理器包含guard。 我的包含是这样的:

(文件 - >包含)

main.cpp - > header.h; Character.h

header.h - > vector,iostream,...,DataFiles.h

Character.h - > DataFiles.h,header.h,CharFrame.h

CharFrame.h - > DataFiles.h,header.h

一切正常。但是,如果我只是删除main.cpp的#include“Character.h”来移动它在header.h中,我在编译时会遇到很多错误。所以现在是:

main.cpp - > header.h

header.h - > ...,DataFiles.h,Character.h。

有什么区别?

这是我的编译器输出:

Inspiron-1545:~/Desktop/LF2_linux$ g++ -Wall main.cpp DataFiles.cpp header.cpp Character.cpp CharFrame.cpp -lSDL -lSDL_image -lSDL_ttf -o test
In file included from header.h:13:0,
             from CharFrame.h:12,
             from CharFrame.cpp:1:
Character.h:55:15: error: ‘CharFrame’ was not declared in this scope
Character.h:55:25: error: template argument 1 is invalid
Character.h:55:25: error: template argument 2 is invalid

如果include被放回到main.cpp中,那么它编译时没有任何错误。

如果您觉得我的代码是必要的,我会编辑这篇文章并粘贴所有内容。

以下是感兴趣的行:

header.h:13 ->
 #include "Character.h"
CharFrame.h:12 -> 
 #include "header.h"
CharFrame.cpp:1 -> 
 #include "CharFrame.h"
Character.h:55 ->  
 std::vector <CharFrame*> *frame;

1 个答案:

答案 0 :(得分:5)

您的更改在Character.h和header.h之间创建了一个包含循环。

据推测,Character.h依赖于headers.h中的一些声明。现在,通过您的更改,会发生以下情况:

  1. 包含headers.h,定义其包含保护,预处理器开始检查其内容。

  2. headers.h包含Character.h,然后才能创建自己的声明。

    1. Character.h定义了它的包含保护,预处理器读取其内容。

    2. Character.h包含header.h以获取所需的定义。

        然而,
      1. headers.h看到它的包含守卫,并被解析为空。尚无定义。
    3. 读取Character.h定义。

  3. 读取headers.h定义。

  4. 正如您所看到的,Character.h中的定义是在header.h中的定义之前读取的,它们依赖于它们。

    修复循环包含的最佳方法是尽可能用前向声明替换#include。在极少数情况下,可能需要将声明与包含实际混合,但您应该不惜一切代价避免这样的事情。