【发布时间】:2012-03-31 03:54:08
【问题描述】:
这是一个奇怪的问题,我想知道其他人是否见过。我们正在为 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 文件中提取数据。
我只是想知道是否有人见过这样的事情,或者有可能的调查途径。
非常感谢...
【问题讨论】:
-
#include "X.h"或'include "x.h"?您是否收到任何警告,例如“未能找到 'X.h'”? -
您能否发布一个实际的最小示例来展示您遇到的问题(包括 cpp 文件)?当我尝试编译你的头文件时,编译器正确地抱怨你的类声明最后缺少分号。当我解决这个问题时,代码在 Mac OS 下使用 gcc 4.2 编译得很好。 (我怀疑您的实际头文件包含包含警卫或
#pragma once,并且您的问题与此有关。) -
你可能想看看你是否有一个 X.h 头文件的旧副本,它正在被编译器而不是最新的头文件拾取。
-
标头存储在哪里?检查您的项目设置构建选项卡。向下滚动到“搜索路径”部分,确保可以找到您的标题。另请阅读始终搜索用户路径的帮助,尽管这可能不是主题。
-
重要的是要记住 Apple 默认文件系统不区分大小写。所以“X.h”和“x.h”是同一个文件名。
标签: c++ xcode macos include forward-declaration