繁体   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