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)
您的更改在Character.h和header.h之间创建了一个包含循环.
据推测,Character.h依赖于headers.h中的一些声明.现在,随着您的更改,会发生以下情况:
包含headers.h,定义其包含保护,并且预处理器开始检查其内容.
headers.h包含Character.h,然后才能生成自己的声明.
Character.h定义了包含保护,预处理器读取其内容.
Character.h包含header.h以获取所需的定义.
读取Character.h定义.
读取headers.h定义.
如您所见,Character.h中的定义在header.h中的定义之前读取,它们依赖于它们.
修复循环包含的最佳方法是#include
尽可能用前向声明替换s.在极少数情况下,可能有必要将声明与包含实际混合,但您应该不惜一切代价避免这样的事情.