[英]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*
指向命令行參數。
我建議您通過C的基礎知識來理解它。 您可能學到了足夠的知識,可以在一兩天內完成項目。 經典文本是C編程語言 。 它仍然是最好的恕我直言之一。
不幸的是,關於這個的教程並不多。 我認為在stackoverflow中已經問過幾次了,所以在這里搜索會給您一些提示。 您要避免的第一個陷阱是,您需要為obj-c文件使用“ .mm”擴展名以啟用c ++擴展名。
最后一個指針是查看開源項目(例如chrome),看看它們如何將obj-c和C ++混合在一起。 Google搜索也是您的朋友:)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.