簡體   English   中英

如何將C ++代碼合並到Objective-C項目中?

[英]How to incorporate C++ code in Objective-C project?

我想在Xcode項目中使用一些C ++代碼,但是我對這兩種語言的了解還不夠,還不知道如何進行。 我已經去過Obj-C一段時間了,並且在應用商店中有一個應用,但仍在學習...

我要使用的代碼有兩個具有相同名稱, .h.c擴展名的文件。 我認為它們對應於Obj-C中的.h.m文件,但是它們缺少我熟悉的@interface@implementation結構。 還有一個main.c ,我不知道該怎么辦。 看來它是主程序-我是否應該嘗試將其代碼提取到我的主viewController

也許是一個好的教程的鏈接? 也許這個問題太含糊...

僅供參考-我要使用的代碼用於計算日出和日落時間,位於: http//www.risacher.org/sunwait/

謝謝!

編輯:

感謝您的建議-在獲得此信息之前,我可能需要做一些進一步的學習。 但是我取得了一些進步...

main.c (似乎很奇怪有一個名為...的文件),有一個像這樣的函數(?):

int mainFunction(int argc, char *argv[])
{
// a bunch of function-y stuff
}

它被稱為main但我將其更改為mainFunction來消除錯誤。 現在它可以編譯了,我可以調用它了,但是編譯器這樣警告我: warning: implicit declaration of function 'mainFunction'在我調用它后崩潰。

現在它可以編譯了,我可以調用它了,但是編譯器這樣警告我:警告:函數'mainFunction'的隱式聲明,在我調用它后崩潰。

這是因為,在使用此函數的地方,您不會向前聲明或包含該函數的聲明。 在您的Objective-C代碼中,您應該添加以下代碼:

int mainFunction(int argc, char *argv[]);

另請注意,“。c”文件擴展名是C代碼,而不是C ++。 由於Objective-C是C的超集,因此您可以輕松地將擴展名更改為“ .m”,並且由於需要此前向聲明,您仍然會遇到相同的錯誤。 在進入Objective-C領域之前,我強烈建議您先熟悉C和C ++代碼。 如果您希望放棄學習C ++,那么至少應該在進入Objective-C之前加強C的知識,因為C的基礎知識是適用的。

在此處的Objective-C 2.0指南中有一章: http : //developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.html#//apple_ref/doc/uid/ TP30001163-CH10-SW1

基本上,您可以混合使用C ++和Objective-C,但是有兩個陷阱。 聽起來您可能需要總體上了解C ++,然后再探索Objective-C ++的細微差別

將源從.m重命名為.mm,然后它們成為Objective C ++。 您可以從Objective C代碼實例化並調用C ++類,反之亦然。 但是,您不能從C ++類派生ObjC類,反之亦然。 另外,請記住調用約定-就.mm / .cpp文件而言,.m文件中的全局函數為extern "C"

將.mm和.cpp鏈接在一起也可以正常工作。

首先,如果文件的擴展名為.c ,則幾乎可以肯定它們是C而不是C ++。 您所要做的就是將它們添加到項目和目標中,並在調用C函數的Objective-C中包含相關的.h文件。

現在,您曾經擁有一個名為main()的函數這一事實告訴我們,您有一個獨立的程序。 每個獨立程序都必須具有一個稱為main()的函數,這是該程序的入口。 您的Objective-C應用程序將已經具有函數main() ,這就是為什么您遇到錯誤的原因。 您可以采用重命名重復副本並調用它的方法,但是這種方法存在很多陷阱。

  • 如您所知,您需要一個函數原型來停止隱式聲明警告。 這應該是

     int mainFunction(int argc, char* argv[]); 

    並應放在您要在.m文件中包含的標題中。

  • 在C語言中,對參數進行了某些假設。 argc是argv中char*的數量。 argv[0]通常是在命令行上調用的程序的名稱。 因此argc必須至少為1,而argv[0]必須指向一個字符串。 argv中剩余的char*指向命令行參數。

  • 通常,命令行程序希望能夠接受來自鍵盤的輸入並在屏幕上顯示輸出。 這是通過三個文件描述符完成的:stdin,stdout和stderr。 Stdin用於輸入,stdout用於常規輸出,stderr用於輸出錯誤和其他“帶外”消息。 在GUI應用程序中攔截這些文件描述符並非易事。

我建議您通過C的基礎知識來理解它。 您可能學到了足夠的知識,可以在一兩天內完成項目。 經典文本是C編程語言 它仍然是最好的恕我直言之一。

不幸的是,關於這個的教程並不多。 我認為在stackoverflow中已經問過幾次了,所以在這里搜索會給您一些提示。 您要避免的第一個陷阱是,您需要為obj-c文件使用“ .mm”擴展名以啟用c ++擴展名。

最后一個指針是查看開源項目(例如chrome),看看它們如何將obj-c和C ++混合在一起。 Google搜索也是您的朋友:)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM