Objective-C ++与Objective-C完全不同吗?

时间:2010-06-15 00:52:20

标签: c++ c objective-c objective-c++

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

显然C和C ++是不同的语言,即使C ++和C直接兼容,Objective-C ++和Objective-C的情况如何?

6 个答案:

答案 0 :(得分: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 method)。
  • C ++“by value”语义不能应用于Objective-C对象,只能通过指针访问。
  • Objective-C声明不能在C ++模板声明中,反之亦然。但是,Objective-C类型(例如,Classname *)可以用作C ++模板参数。 Objective-C和C ++异常处理是截然不同的;每个处理程序都无法处理其他类型的异常。
  • 必须小心,因为Objective-C和C ++的异常运行时模型的析构函数调用约定不匹配(即,当Objective-C异常退出C ++对象的作用域时,不会调用C ++析构函数)。新的64位运行时通过在这种意义上引入与C ++异常的互操作性来解决这个问题

答案 1 :(得分:5)

Objective-C ++简单地允许混合Objective-C和C ++代码(带有警告)。它本身并不是一种真正的语言,而是一种允许两种语言混合的机制。

答案 2 :(得分:4)

C和C ++不直接兼容。它们都不是另一个的超集(尽管大多数C是有效的C ++)。 Objective-C是C的严格超集,Objective-C ++是C ++的严格超集。这些是你可以做的唯一陈述(除了简单地逆转它)。

答案 3 :(得分:2)

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

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

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

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

答案 4 :(得分:2)

乍一看,使用Objective-C ++方言看起来很简单。这是在同一个编译器中将C ++和Objective-C 混合在一起的结果,并且GCC中现在存在强大的实现,现在是clang。考虑到Objective-C和C ++的细节有多么不同,GCC黑客已经做得很好。但是当您开始将.m文件重命名为.mm以引入C ++块时,您很快意识到它并不那么简单。

几十年来,头文件和C预处理器一直给C,C ++和Objective-C程序员带来了麻烦。当你尝试混合语言时会变得更糟。假设您想在项目中的Objective-C类中使用STL的映射。据我所知,Apple的Foundation库不包含已排序的基于树的地图;例如,我们的一个StyleKit组件就是这样。所以我们只需在我们的类中为地图创建一个实例变量,然后我们就去了:

#include <map>
@interface MyClass : NSObject {
 @private
 std::map<int, id> lookupTable;
} 
 // ...
@end

但是,std :: map [2]只对C ++感知编译器有意义,并且只在#include [3]之后,所以这个头现在只能从Objective-C ++文件#imported。现在,任何使用此类的代码都需要转换为Objective-C ++本身,从其他标题导入会导致级联效应,从而迅速包含整个项目。

在某些情况下,这可能是可以接受的。但是,将整个项目或大部分项目切换为仅引入在一个位置使用的库不仅过多;如果您是唯一一个在具有多个Objective-C程序员的项目上了解C ++的人,您可能会发现这是一个不受欢迎的想法。它也可能导致问题的方式与使用C ++编译器编译纯C代码很少完全没有问题。而且,这意味着代码不能在其他Objective-C项目中自动重用。

因此,除非它如此重要,否则最好不要混淆

要了解有关在目标c中使用目标c ++的策略的更多信息,反之亦然,请点击here

答案 5 :(得分:1)

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

Objective-C ++实际上并不是一种新语言,它只是指定了一些允许Objective-C代码与C ++代码共存的东西。说你的应用程序是用Objective-C和C ++编写的,或者只是Objective-C ++可能就是你想要的。使用Objective-C,Objective-C ++,C ++都是多余的。