Objective-C++语言:我在哪里可以找到更多关于它的信息?

9

我已经学习了几个月的C++,发现它是一种非常好的语言,尽管有些缺点。

我想知道所谓的Objective-C++到底是什么,以及是否值得将其作为主要开发语言来针对苹果环境(即Mac OS X和iPhone OS)进行学习。在网上搜索时,我只找到了一些不错的文章:主要是维基百科条目Mac Dev Center中的一篇。

维基百科说:

Objective-C++是GNU编译器集合的前端,可以编译使用C++和Objective-C语法组合的源文件。 Objective-C++将Objective-C添加到C++中的扩展中添加到C ++中。

Mac Dev Center的文章补充道:

苹果的Objective-C编译器允许您在同一源文件中自由混合使用C++和Objective-C代码。 这种Objective-C/C++语言混合体称为Objective-C++。 使用它,您可以从Objective-C应用程序中使用现有的C ++库。

苹果的文章将Objective-C++称为一种语言。这是正确的吗?

我想知道以下内容:

  • 是否可以在不了解C/Objective-C的情况下学习和使用Objective-C++?
  • 是否有任何好的书籍、网站、论坛等可以获取更多信息和/或帮助?
  • 据您所知,是否有任何用Objective-C++完成的大型项目?

看起来 OBJ-C++ 不是一种语言,而是有一个 GNU CPP 可以使 C++ 和 OBJ-C 之间产生一些交互。考虑到维基上的缺点,我会远离它。 - KevinDTimm
@kevindtimm:如果你的代码包含苹果特定的接口(这会强制使用ObjC运行时)并且使用了C++库(例如Box2d),那么你确实需要ObjC++。 - kennytm
5个回答

13

当你想要开发有竞争力的商业强度(即足够好以至于人们愿意为它们付款)的苹果应用程序时,你应该学习Objective-C++。

它实际上就是将Objective-C和C++组合在同一个文件中。

对于Objective-C,可以使用任何流行的苹果开发博客/邮件列表/新闻组之一。特别是由苹果直接提供的那个。

对于C++也是一样的,有数十个博客/邮件列表/入门教程。但是,如果您已经了解编程,则C及其Objective-C附加组件非常简单易学。而C++则是一种完全不同且复杂的东西。获取一些好的书籍并学习它(10年后您将能够完全理解这种语言:-),但是只需要了解其中一小部分知识就可以编写C++程序。

现在我们来到一个魔法问题:为什么您应该使用C++而不是仅使用Objective-C。答案很简单。除了明显的包装现有C++库之外,首先Objective-C很慢——方法调用。通常建议在方法中做一些严肃的事情,以避免在此语言中出现的运行时处罚。

但是,特别是对于容器,您应该真正考虑使用C++模板。向量比NSArray快得多。如果数据集很大,您会感受到差异。此外,我发现C++容器更易于使用,因为它们避免了您必须在Objective-C中执行的类型转换。

在iPad和iPhone上慢速ARM CPU的情况下,这不是过早优化。

遗憾的是,您不能混合使用C++和Cocoa类,因此C++只应用于算法数据。对于GUI,您必须使用Cocoa和Objective-C类。

获得正确的C++和Objective-C之间的平衡是作为Apple程序员需要开发的一部分技能。


我扩展这个答案来说,是的,你仍然应该学习Objective-C++而不仅仅是Swift。性能论点在Swift中仍然有效,它使用与Objective-C相同的对象模型,并为结构数据对象添加了类似于C++的静态类型的东西。现在,在C/C++代码中完全支持ARC的情况下,混合使用C++/C/Objective C已经变得非常容易。只有当你永远不想将程序移植到另一个系统(这是Swift和C#的整个供应商锁定思想)时,你可以舒适地忽略它并仅使用Swift。 - Lothar
现在再过4年。Swift学会了与XCode 15原生交互(至少是受限的C++子集)。这一切都是因为苹果知道他们需要发展游戏行业(并重用库来支持他们的iVision VR)。所以也许有一天Objective-C仍然处于维护模式并且被淘汰,但这只会发生在C++引入与Objective-C++语言冲突的特性的情况下。 - Lothar
现在再过4年。Swift学会了与XCode 15原生交互(至少是受限的C++子集)。这一切都是因为苹果知道他们需要发展游戏行业(并重用库来支持他们的iVision VR)。所以也许有一天Objective-C仍然处于维护模式并且已经过时了,但这只会发生在C++引入与Objective-C++语言冲突的特性的情况下。 - undefined

11

Objective-C++实际上只是将Objective-C和C++混合使用。由于它允许从两种语言中使用语法,因此可以说它是一种新语言。

当我需要与某些C++库进行Objective-C代码的接口时,我主要使用ObjC++(.mm源文件)。在这种情况下,能够调用C++非常方便。就个人而言,我不知道有多少人真正混合使用C++和Objective-C。


2

OBJECTIVE-C++

Objective-C是ANSI C的一组扩展。 Objective-C++是应用于C++的同一组扩展。苹果公司的Objective-C编译器也是一个Objective-C++编译器。

Objective-C的优点之一是作为ANSI C的超集,它可以轻松地与世界上数百万行现有的C代码混合使用。Objective-C++可以与已经存在的数百万行C++代码混合使用。Objective-C++完全支持C++功能,如名称重整,因此可以在Objective-C++代码和现有C++代码之间进行直接链接。

Objective-C源代码文件由.m扩展名标识。 苹果公司的编译器将带有.M或.mm扩展名的文件视为Objective-C++源代码。此外,-x编译器选项可用于指示苹果公司的编译器将任何输入文件视为Objective-C++源代码。

苹果公司的在线文档描述了 Objective-C++的特性和限制,网址为http://developer.apple.com/techpubs/,并在Apple的开发人员工具中提供了发行说明。总的来说,Objective-C类和C++类可以混合使用,以便Objective-C方法可以调用C++成员函数,反之亦然,或者C++类可以包括指向Objective-C对象的指针作为成员变量。Objective-C类不能从C++类继承,反之亦然。两个类层次结构必须保持不同。在C++和Objective-C之间,关于实例创建和删除的语义存在显著差异。因此,混合它们可能会很棘手,但是在新的Objective-C项目中重用现有的C++代码的好处超过了引入的复杂性。

关于Objective-C++的一些更实际的观点

Gcc同时是C、Objective-C和C++的编译器。您可以在某种程度上混合使用C++和Objective-C代码。要指示编译器一个文件包含C++代码以及Objective-C,请使用文件扩展名.mm或.M而不是.m。

以下是C++和Objective-C代码可以一起使用的一些方式:

  1. Objective-C对象可以具有指向C++对象的字段,反之亦然。

  2. Objective-C代码可以调用C++对象的方法,反之亦然。

  3. Objective-C对象可以具有C++对象(而不是指针)作为字段,但前提是C++类没有虚方法。

但是,Objective-C和C++并不完全兼容。以下是一些您无法执行的操作:

  1. Objective-C类不能继承自C++类,反之亦然。

  2. 您不能在C++命名空间或模板中声明Objective-C类,反之亦然。

  3. 您不能使用C++关键字作为Objective-C变量名。

  4. 您不能使用C++语法调用Objective-C方法,反之亦然。

最后,有一些限制是为了避免歧义而实施的:

  1. 您不能将id作为C++模板名称。如果可以,声明id< TypeName > var可以是C++模板声明或使用协议的Objective-C声明。

  2. 如果您将全局作用域的C++变量传递给Objective-C方法,则需要在第一个和第二个冒号之间加上一个空格。

您可能会发现以下链接有帮助:

  1. https://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1

  2. https://www.raywenderlich.com/62990/introduction-c-ios-developers-part-2

  3. https://www.sitepoint.com/using-c-and-c-in-an-ios-app-with-objective-c/

  4. https://github.com/sitepoint-editors/HelloCpp


1

1) 我怀疑这一点,因为它们中的每一个都是C语言的超集。 我不认为Objective-C++是一个全新的语言。它只是两者的混合,给你一些额外的可能性 - 即重用现有的C++代码,或在更时间关键的代码段中使用更快的C++,或在没有Objective-C/Cocoa接口公开的地方使用C++代码(主要是与硬件相关的低级操作,如串行端口/ioctls、OpenGL等)

2) 我认为关于这个主题的资源...

3) 算了吧...我的意思是你认为什么样的项目算大。我只是知道有一堆项目(也许并非所有项目都是商业项目,不能在商店购买软件),出于1中列出的原因,使用了这种混合。


2
实际上,C++并不是C语言的超集。它们非常接近,但例如,C++在类型转换方面要严格得多,因此在C++编译器中无法编译的代码可能在C中是完全有效的。在大多数情况下,这些差异实际上是改进,在我看来很容易修复,但我只是想纠正一下。有趣的是,Objective-C是C的严格超集。任何有效的C代码也是有效的ObjC代码。 - uliwitness

0

许多大型项目都使用一些Objective-C++。例如,Camino、Chromium和Firefox都是包含Objective-C++的重要开源项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接