2011-06-08 36 views
4

所以我想在我的ios项目中使用C++。在xcode/objective c中使用C++

我提出一个新的项目(所有默认设置,新安装的Xcode)后,我创建了一个Question.hQuestion.mm文件,如:Iostream: No such file or directory

Question.h 

#include <iostream> 
#include <string> 
using std::string; 

class Question { 
public: 
    string text; 
}; 


Question.mm 

#include "Question.h" 

它有点像错误的尖叫声

使用iOS SDK 4.3的Xcode 3.2.6

我在做什么错?

+1

错误消息中的Iostream以大写字母开头 - 您是否已在任何代码中完成此操作? – Mark 2011-06-08 12:36:57

+0

如果您重命名Question.mm - > Question.cpp,是否显示相同的错误? – 2011-06-08 12:46:49

+1

它在Build Results窗口中用大写字母表示,但在代码中它是'iostream'。还有一件事:如果我将所有代码从'h'文件移动到'mm'文件,那么它确实成功构建 – 2011-06-08 12:49:06

回答

5

最有可能的原因是你在非C++文件中包含Question.h,例如你的AppDelegate是.m文件,你试图在其中包含Question.h

有两种解决方案。首先,您可以制作所有Objective-C++(将所有.m文件重命名为.mm)。从历史上看,我发现这非常不方便,因为Xcode和gdb在ObjC++中总是遇到很多麻烦,并且您可能会产生很多混淆(可怕的“没有这个指针”和“堆栈帧的未知语言”错误GDB)。我还没有用最新版本的Xcode和gdb做足够的工作,以确定这是否仍然是一个问题,但我怀疑这是因为gdb没有得到很多工作。此外,ObjC++编译速度较慢。

另一种选择是wrap up your C++ into ObjC,以便您可以将其自由包含在代码的纯粹ObjC部分中。这是我通常采取的方法。 ObjC++是一种混乱的语言IMO,我相信最好是使ObjC(.m)和C++(.cpp)保持纯粹,并用一层薄薄的ObjC++(.mm)将它们粘合在一起。

+0

我仍然无法相信我是多么的茫然。我在appDelegate中包含Question.h。有趣的是,我为Question.h做了一个项目搜索,没有任何结果显示。 – 2011-06-08 13:08:20

0

尝试重命名为Question.mmQuestion.cpp,因为xcode根据扩展名决定使用哪个编译器。

+0

,但不修复它。此外,我还有另一个项目,我前一段时间创建,它使用h/mm文件,并且它们编译成功。不能指出它们之间的区别。 – 2011-06-08 12:52:18

+0

作为一个方面说明:如果你*可以*将Question.mm重命名为Question.cpp,你应该这样做。纯C++比Objective-C++更易于管理和编译速度更快。如果你只需要访问几个可可类的东西(比如读取一个NSArray),你也可以使用Core Foundation,它是许多Cocoa数据结构的纯C接口。您可以将它包含在C++中,而无需切换到Objective-C++。很显然,有些地方需要ObjC++,但是当你不需要它的时候,很好避免。 – 2011-06-08 13:23:14

1

确保你的main.m文件没有导入你的AppDelegate文件。它可以使用这样的:

NSStringFromClass([AppDelegate class])

而是你可以这样做:

@"AppDelegate"

这解决了我的问题。