3

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

(文件 -> 包括)

main.cpp -> header.h;字符.h

header.h -> 向量、iostream、...、DataFiles.h

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

CharFrame.h -> 数据文件.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;
4

1 回答 1

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 定义被读取。

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

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

于 2013-08-31T14:41:04.603 回答