【问题标题】:Are There Constraints on Includes of Header Files in Main.cpp?Main.cpp 中包含的头文件是否有限制?
【发布时间】:2015-10-24 13:53:29
【问题描述】:

我刚刚设法解决了我自己的问题,解释了here。我不明白的是它背后的原因。基本上在将一个工作程序拆分为一个 makefile 之后,所有包含都在正确的位置,一个特定的对象构造调用停止工作。

解决方案最终是将 #include "filename.h" 在 main.cpp 文件中的 10 个左右 #include 列表中上移。

这是否意味着存在某种约束?我不知道有一个,并且自从进行此更改以来,现在已排在底部的另一个标题仍然可以正常工作。

Pastebin

编辑:应一些用户的要求,我添加了最少的代码,这些代码会为我产生错误。虽然它仍然只有 300 多行...代码顶部的 cmets 解释了如何使错误发生,但需要将代码拆分为单独的文件并使用 makefile。

【问题讨论】:

  • 预处理器将所有代码粘贴到包含文件#included 中(除非被警卫阻止)。所以几乎可以肯定这是一个 PEBKAC 错误。
  • 是的,我也是这么想的。我只是不明白为什么将#include 向上移动几个位置会改变任何事情。
  • 仍然没有足够的信息来查看问题所在。
  • 您的某个标头可能使用了该标头中的某些内容而不包含它,因此您自己事先包含它可以修复它。
  • 其他文件是否包含它们所依赖的头文件?

标签: c++ class object makefile header-files


【解决方案1】:

确实存在限制:一个包含文件可能需要在另一个包含文件中定义的类。因此,您必须确保以正确的顺序包含这些文件。

例子:

//======== File A.h ==========
class A {
   ...
};

//======== File B.h ==========
class B : public A {   // class B needs A to be defined first !!
   ...
};

//======== File main.cpp that works ========
#include "A.h"
#include "B.h" // ok:  relies on A and A is already defined
... 

//======== File ouch.cpp that fails ========
#include "B.h" // not ok:  relies on A but A is not yet defined !!
#include "A.h"
...

但幸运的是,有一些好的做法可以避免此类陷阱:在您的标头中使用包含保护,并且在任何标头中,预防性地包含由于依赖关系而需要的其他标头。这是nice article 解释这一点。

【讨论】:

  • Ehm .... 不。如果B.h 依赖于A.h,那么它应该包括A.h 如果更改包含顺序会更改您的程序,您的代码错误。这真的很重要。
  • 我所有的标题都包括后卫,几周前我遇到了这个可爱的问题。我可以理解您对#includes 和依赖的意思,但错误主要来自第 160 行,所以到那时所有内容都会从包含中复制,不是吗?老实说,我很想链接整个代码,但我怀疑是否有人会为查找超过 300 行可能只是用户错误的内容而烦恼。
  • @DwayneH:这就是为什么需要minimal but complete testcase 的原因(正如帮助中心向您解释的那样,您在询问之前仔细阅读过)。也因为如果你做了一个,你可能自己就能解决它。
  • @LightnessRacesinOrbit 是的,或者当然!我是要输入示例和指向解释此问题的文章的链接。
  • @DwayneH:对,所以,对于 this 问题,构建一个最小的测试用例!你说“我确实这样做了”,但你不可能这样做,因为在你说“我很想链接整个代码,但我怀疑任何人都可能会费心寻找超过 300 行的东西可能只是是用户错误”。
【解决方案2】:

没有固有的限制,不。但是,如果程序写得不好,那么包含顺序可能很重要。这通常归结为 #include 语句未正确处理标头之间的依赖关系。

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2017-03-23
    • 2021-05-03
    相关资源
    最近更新 更多