我正在开发一个项目,每个头文件都有一个预处理器包含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;
答案 0 :(得分:5)
您的更改在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
。在极少数情况下,可能需要将声明与包含实际混合,但您应该不惜一切代价避免这样的事情。