2009-08-15 86 views
1

我有一個C++應用程序,我試圖移植到iPhone並開始我試圖用obj-C++紋理加載器替換我的C++紋理加載器,以便我可以使用可可庫。從C++文件使用Objective-C++文件

我的很多C++文件(.cpp文件)調用紋理裝載機類似的:

GLuint mTexture = TextureLoader::LoadTexture("file.png") //LoadTexture is a static method` 

,但每當我試圖做一個TextureLoader類(一個.mm文件中),有Obj- C代碼,我不得不使調用類也成爲一個.mm文件。

我想避免使用.mm的蠕變。我該怎麼做?它甚至有可能嗎?

基本上我有,有一個.mm文件...

GLuint TextureLoader::LoadTexture(const char* path) 
{ 
    //...lots of c and obj-c code 
    return texture 
} 

,是除了C++類的(或者是OBJ-C++在這一點?)

我想成爲能夠使用它從一個.cpp文件,而不必使呼叫類也.mm

是否有無論如何做到這一點?

乾杯傢伙。

回答

0

我不知道有什麼辦法做到這一點。但是,並不是必須將所有C++成員函數定義放在一個文件中 - 只需將所有純C++的東西都粘貼到.cpp中,而將需要ObjC的東西粘貼到.mm

同樣,如果實際上具有相同的重複ObjC代碼(可能是參數化),然後重構它成一個普通的C函數或C++類在一個單獨的.mm - 使得沒有ObjC在相應.h構建體 - 和然後通過包含標題在需要的地方使用該函數/類。

+0

謝謝帕維爾,你明白了。我認爲問題在於我必須在紋理加載代碼的頭文件中使用Obj-c代碼。這意味着當我的C++代碼包含.h文件時,編譯器不喜歡它。 我會嘗試總結一下: 假設我有Foo.cpp和Foo.h(僅用於C++),並且Foo.cpp需要包含TextureLoader.h,它包含一個C++類定義,其成員方法使用obj-c代碼在TextureLoader.mm中)。確保TextureLoader.h中沒有obj-c或可可代碼,否則Foo.cpp將不能#include它。 – user156848 2009-08-16 00:23:33

+0

顯而易見的答案是 - 不要定義在頭文件中使用ObjC結構的成員函數;而是在.mm文件中定義它們。 – 2009-08-16 07:51:42

4

我想避免使用.mm的蠕變。我該怎麼做?它甚至有可能嗎?

如果您想使用Objective-C++,則不需要。

1

最簡單的事情就是將所有東西都編譯成Objective-C++。您不必更改所有擴展名;留下他們爲.cpp並設置Xcode將所有內容編譯爲Objective-C++:在項目的構建設置下,在「GCC X.X - Language」類別中,將「編譯源代碼」更改爲「Objective-C++」。 (我假設你的問題是你有一大堆.cpp文件,而你不想將它們全部重命名爲.mm。編譯爲Objective-C++將不會影響那些實際上沒有影響的文件使用任何Objective-C的東西(只有非常罕見的例外),它會讓你的生活更容易爲做好些。)

0

在Xcode中,您.cpp右鍵單擊文件,並選擇「獲取相關信息」。在「常規」選項卡中,將文件類型更改爲sourcecode.cpp.objcpp。這將構建這個文件,並且只將這個文件構建爲Objective C++。

0

不確定所涉及代碼的大小,但如果它有一個非常小的接口,可以爲C++代碼編寫一個C封裝器,然後圍繞頭文件聲明和函數定義使用extern C { /* ... */ }

這實際上會「隱藏」Objective-C的C++調用,並允許您規避將文件從m重命名爲mm擴展名的要求,和/或將調用文件編譯爲Objective -C++。

Objective-C++使用不同的編譯規則,比標準的Objective-C編譯慢。