2011-06-08 37 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"

這解決了我的問題。