这是一个奇怪的问题,我想知道是否有其他人见过。我们正在为Mac和PC编写跨平台的C ++代码,这只发生在Mac上。
假设我有一个类,其.h文件看起来像这样。
class X {
public:
int _myValue;
void myFunction();
}
我有另一个类,其.h文件看起来像这样:
#include "X.h"
class Y {
private:
X _myObj;
}
这不会编译。我们得到一个错误,表明X未定义。解决方案是在Y.h文件中为X添加前向声明,例如: X级;
我们已经做了一段时间了,但是现在我们遇到了效果不好的情况。例如,如果我们有一个.h文件,该文件在.h文件中定义了一个模板方法,并且该方法引用了另一个类中的方法,则编译器对此一无所知。同样,如果我们引用在包含的类中定义的枚举,则编译器无法识别它(此问题的解决方法是将枚举放在单独的.h文件中,并且它很好地选择它)。
这几乎就像编译.cpp文件时编译器没有从包含的.h文件中提取数据一样。
我只是想知道是否有人见过这样的事情,或者有可能进行调查。
非常感谢...
答案 0 :(得分:1)
有一个公共系统头文件X.h
,它是X11窗口工具包的一部分。我建议更改头文件的名称,使其不与任何系统头冲突。
您可以尝试更改编译器开关,以强制它在系统包含目录之前考虑包含头文件的目录,但这可能更省力,更脆弱。
答案 1 :(得分:0)
对于您的第一期(课程),正确的答案是使用前向声明。您应该避免在其他项目包含文件中包含项目包含文件。这可以创建包含循环(如果我不得不猜测,这很可能是你的问题)。修改标题时,它还会产生过多的构建流失。
对于您的其他问题(枚举,模板),这通常是由于包含周期。通过尽可能避免包括那些周期是最好的选择。
有关此问题和最佳做法的更多讨论,请参阅Header file best practices for typedefs。
答案 2 :(得分:0)
我只是感到惊讶,没有人提到包含文件的规范方案,例如,
foo.h中:
#ifndef FOO_H
#define FOO_H
// body of the include file
#endif
我怀疑在这种特定情况下,“xh”和“Xh”的冲突可能是您所看到的问题,但如果您不保护这样的包含文件,将最终咬你。
使用该守卫,您可以在任何需要的地方加入“x.h”。