Main.cpp中是否存在包含头文件的约束?

时间:2015-10-24 13:53:29

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

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

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

这是否意味着存在某种约束?我不知道其中一个,并且自从进行此更改后,另一个现在已经处于最低位置的标题仍然正常工作。

Pastebin

编辑:根据某些用户的要求,我已经为我添加了产生错误的最少代码。它仍然只有超过300行......代码顶部的注释解释了如何使错误发生,但需要将代码拆分为单独的文件并使用makefile。

2 个答案:

答案 0 :(得分: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解释这一点。

答案 1 :(得分:0)

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