gpt4 book ai didi

C++ header 包含

转载 作者:太空狗 更新时间:2023-10-29 20:42:26 24 4
gpt4 key购买 nike

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

(文件 -> 包含)

main.cpp -> header.h;字符.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;

最佳答案

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

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

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

  2. headers.h 包含 Character.h,然后才进行自己的声明。

    1. Character.h 定义了它的 include guard,预处理器读取它的内容。

    2. Character.h 包括 header.h 以获得它需要的定义。

      1. headers.h,但是看到它的 include guard,并被解析为空。尚未做出定义。
    3. 读取 Character.h 定义。

  3. 阅读 headers.h 定义。

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

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

关于C++ header 包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18549134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com