强制在Mac上使用C ++代码的前向声明(使用Xcode)

时间:2012-03-14 16:42:14

标签: c++ xcode macos include forward-declaration

这是一个奇怪的问题,我想知道是否有其他人见过。我们正在为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文件中提取数据一样。

我只是想知道是否有人见过这样的事情,或者有可能进行调查。

非常感谢...

3 个答案:

答案 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”。