我刚刚设法解决了我自己解释的问题here。我不明白的是它背后的原因。基本上,在将一个工作程序拆分为一个makefile之后,所有包含都在正确的位置,一个特定的对象构造调用停止工作。
最终解决方案是移动#include" filename.h"在main.cpp文件的10个左右#includes列表中更高。
这是否意味着存在某种约束?我不知道其中一个,并且自从进行此更改后,另一个现在已经处于最低位置的标题仍然正常工作。
编辑:根据某些用户的要求,我已经为我添加了产生错误的最少代码。它仍然只有超过300行......代码顶部的注释解释了如何使错误发生,但需要将代码拆分为单独的文件并使用makefile。
答案 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
语句正确处理的标头之间的依赖关系。