如何在Objective-C项目中加入C ++代码?

时间:2010-12-01 03:32:22

标签: c++ objective-c ios

我想在Xcode项目中使用一些C ++代码,但我还不了解任何一种语言,但还不知道如何继续。我已经在Obj-C工作了一段时间,并在应用程序商店中有一个应用程序,但仍在学习......

我想要使用的代码包含两个名称相同且.h.c扩展名的文件。我认为它们与Obj-C中的.h.m文件相对应,但它们缺少我熟悉的@interface@implementation结构。还有main.c,我不知道该怎么做。它看起来像是主程序 - 我应该尝试将其代码放入我的主要viewController吗?

也许链接到一个好的教程?也许这个问题太模糊了......

仅供参考 - 我想用的代码用于计算日出和日落时间,位于:http://www.risacher.org/sunwait/

谢谢!

编辑:

感谢您的建议 - 在我得到这个建议之前,我可能还需要做更多的学习。但我取得了一些进展......

main.c中(有一个名为that的文件似乎很奇怪),有一个像这样的函数(?):

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

它被称为main,但我将其更改为mainFunction以消除错误。现在它编译,我可以调用它,但编译器因此警告我:warning: implicit declaration of function 'mainFunction'并且在我调用它之后崩溃。

5 个答案:

答案 0 :(得分:2)

  

现在它编译并且我可以调用它但是编译器因此警告我:警告:隐式声明函数'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基础知识适用。

答案 1 :(得分:1)

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,但是有一些陷阱。在探索objective-C ++

的细微差别之前,您可能需要了解更多关于C ++的知识

答案 2 :(得分:1)

将源从.m重命名为.mm,然后它们变为Objective C ++。您可以从Objective C代码实例化和调用C ++类,反之亦然。但是,您不能从C ++类派生ObjC类,反之亦然。另外,请注意调用约定 - .m文件中的全局函数是extern "C",就.mm / .cpp文件而言。

将.mm和.cpp链接在一起工作正常。

答案 3 :(得分:1)

首先,如果您的文件具有.c扩展名,那么它们几乎肯定是C而不是C ++。您所要做的就是将它们添加到项目和目标中,并将相关的.h文件包含在您调用C函数的Objective-C中。

现在您曾经拥有一个名为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语言的基础知识来理解它。您可以在一两天内学到足够的知识来推进您的项目。经典文字是The C Programming Language。它仍然是最好的恕我直言。

答案 4 :(得分:0)

遗憾的是,关于此的教程并不多。我认为这已经在stackoverflow中被问了几次,所以在这里搜索会给你一些提示。您要避免的第一个陷阱是,您需要为obj-c文件使用“.mm”扩展名来启用c ++扩展。

最后一个指针是,查看开源项目,例如chrome看看他们如何混淆obj-c和C ++。谷歌搜索也是你的朋友:)。