C++标题包含

Ale*_*qué 3 c++ header include

我正在研究一个项目,每个头文件都有一个预处理器包括后卫.我的包含是这样的:

(文件 - >包括)

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
Run Code Online (Sandbox Code Playgroud)

如果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;
Run Code Online (Sandbox Code Playgroud)

cma*_*ter 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,但是看到它的include guard,并被解析为空.尚无定义.
    3. 读取Character.h定义.

  3. 读取headers.h定义.

如您所见,Character.h中的定义在header.h中的定义之前读取,它们依赖于它们.

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