Objective-C++是完全不同于Objective-C的语言吗?

13

正如标题所说...它们被认为是不同的编程语言吗?例如,如果你使用C++和Objective-C++组合编写了一个应用程序,你会认为它是用C++和Objective-C、C++和Objective-C++还是全部三种语言编写的呢?

显然,尽管C++和C是直接兼容的,但它们是两种不同的编程语言,那么Objective-C++和Objective-C的情况又如何呢?

6个回答

11

来源:https://en.wikipedia.org/wiki/Objective-C#Objective-C.2B.2B

Objective-C++是GNU编译器集合的前端,可编译使用C++和Objective-C语法组合的源文件。Objective-C++在C++中添加了Objective-C在C中添加的扩展功能。由于没有统一各种语言特性背后的语义,因此会应用某些限制:

  • C++类无法派生自Objective-C类,反之亦然。
  • 不允许在Objective-C声明内部声明C++命名空间。
  • Objective-C类不能具有没有默认构造函数或具有一个或多个虚拟方法的C++类的实例变量,但可以无限制地使用指向C++对象的指针作为实例变量(在-init方法中使用new进行分配)。
  • 无法将C++“按值”语义应用于仅通过指针访问的Objective-C对象。
  • Objective-C声明不能在C++模板声明内部,反之亦然。但是,Objective-C类型(例如,Classname *)可以用作C++模板参数。 Objective-C和C++异常处理是不同的;每个处理程序无法处理另一类型的异常。
  • 必须小心,因为Objective-C和C++异常运行时模型的析构函数调用约定不匹配(即,在Objective-C异常退出C++对象的范围时,不会调用C++析构函数)。新的64位运行时通过引入与C++异常的互操作性来解决这个问题。

第一点并不严格正确。我创建了一个从NSObject派生的C++类。 - drawnonward
我已经阅读了维基百科的文章,但它并没有真正告诉我我正在寻找的内容...另外,@drawnonward,你确定吗?维基百科在这样一个重要的问题上出错似乎有点不太可能。 - Jake Petroules

5

Objective-C++简单地允许混合使用Objective-C和C++代码(但有一些限制)。它并不是一个独立的语言,而是一种机制,允许这两种语言相互混合。


我接受这个答案,因为在我看来,它用最准确的方式表达了。这非常有道理,我现在相信我明白了什么是Objective-C++。谢谢。 - Jake Petroules
3
这个回答是不正确的。Objective-C++ 和 Objective-C 一样,都是一种语言。Objective-C 把类似 Smalltalk 的对象语法加入到了 C 语言中,而 Objective-C++ 同样也把类似 Smalltalk 的对象语法加入到了 C++ 中。这就像这样:假设 C 是一辆汽车,你在它上面安装了一个尾翼,那么你现在就得到了 Objective-C。C++ 是另一辆不同的汽车,你在它上面安装了相同的尾翼,你并没有把第一辆(安装了尾翼的)汽车和第二辆(安装了尾翼的)汽车混淆在一起,你只是给两辆汽车都安装了同样的尾翼。 - N_A

4

C和C++并不是直接兼容的。两者都不是彼此的超集(尽管大多数的C是有效的C++)。Objective-C是C的严格超集,而Objective-C++是C++的严格超集。这些是你可以做出的唯一陈述(除了微不足道地反转它)。


2
乍一看,使用Objective-C++方言似乎是一种简单直接的方法。它是在同一个编译器中混合C++和Objective-C的结果,并且在GCC和现在的clang中存在强大的实现。考虑到Objective-C和C++的细节有多么不同,GCC黑客们做得非常出色。但是当你开始将.m文件重命名为.mm以引入C++块时,你很快就会意识到这并不是那么简单。
头文件和C预处理器通常会让C、C++和Objective-C程序员头疼数十年。当您尝试混合语言时情况会变得更糟。比如说,您想在项目中的Objective-C类中使用STL的map。据我所知,苹果的Foundation库中没有排序的基于树的map;例如,我们的StyleKit组件正需要这个功能。因此,我们只需在我们的类中创建一个用于map的实例变量就可以了。
#include <map>
@interface MyClass : NSObject {
 @private
 std::map<int, id> lookupTable;
} 
 // ...
@end

但是,std::map [2] 只有在 C++ 意识到的编译器中才有意义,并且只有在 #include [3]之后才能使用,因此该头文件现在只能从 Objective-C++ 文件中 #import。现在使用该类的任何代码都需要转换为 Objective-C++ 本身,并从其他头文件中导入会导致级联效应,很快就包含整个项目。
在某些情况下,这可能是可以接受的。然而,仅仅为了引入一个仅在一个位置使用的库而切换整个项目或大部分项目不仅过度;如果您是在拥有多个 Objective-C 程序员的项目中唯一知道 C++ 的人,您可能会发现这是一个不受欢迎的想法。它可能也会在与 C++ 编译器编译纯 C 代码时面临麻烦的同样方式引起问题。此外,这意味着代码不能自动在其他 Objective-C 项目中重用。
因此,最好不要混合使用,除非确实很重要。
要了解更多有关在 Objective-C 项目中使用 Objective C++ 和反之亦然的策略,请单击此处

2

在不了解您想应用的“不同语言”的定义的情况下,很难自信地回答这个问题。

Objective-C是C的超集:它在C语言的基础上添加了一些额外的语法。Objective-C++以同样的方式是C++的超集。

C和C++实际上是不同的语言。尽管C++被设计为兼容,但有些C不是有效的C++,反之亦然。

因此,我会说,是的,Objective-C++是与Objective-C不同的语言,因为C++与C是不同的语言。但是,我不会称它们是完全不同的。


1

Objective-C 可能是您在简历中使用的官方术语。

Objective-C++ 并不是一个全新的语言,它只是指定了一些允许 Objective-C 代码与 C++ 代码共存的东西。说您的应用程序是用 Objective-C 和 C++ 编写的或仅使用 Objective-C++ 是您想要的。将所有 Objective-C、Objective-C++、C++ 放在一起是多余的。


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