13

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

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

4

6 回答 6

11

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

Objective-C++ 是 GNU Compiler Collection 的前端,它可以编译使用 C++ 和 Objective-C 语法组合的源文件。Objective-C++ 向 C++ 添加了 Objective-C 对 C 的扩展。由于没有做任何事情来统一各种语言特性背后的语义,因此存在某些限制:

  • C++ 类不能从 Objective-C 类派生,反之亦然。
  • C++ 命名空间不能在 Objective-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++ 异常的互操作性来解决这个问题
于 2010-06-15T00:55:26.530 回答
5

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

于 2010-06-15T01:04:41.453 回答
4

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

于 2010-06-15T00:58:29.567 回答
2

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

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

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

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

于 2010-06-15T00:59:10.390 回答
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++ 文件中 #import。任何使用此类的代码现在都需要转换为 Objective-C++ 本身,并且从其他头文件导入会导致级联效应迅速涵盖整个项目。

在某些情况下,这可能是可以接受的。然而,仅仅为了引入一个在一个位置使用的库就切换整个项目或其中的大部分,这不仅是过分的。如果你是一个拥有多个 Objective-C 程序员的项目中唯一知道 C++ 的人,你可能会发现这是一个不受欢迎的想法。它也可能会导致问题,就像使用 C++ 编译器编译纯 C 代码很少完全没有麻烦一样。此外,这意味着代码不能在其他 Objective-C 项目中自动重用。

所以除非很重要,否则最好不要混淆

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

于 2013-09-27T10:42:54.430 回答
1

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

Objective-C++ 并不是真正的新语言,它只是指定了一些允许 Objective-C 代码与 C++ 代码共存的东西。假设您的应用程序是用 Objective-C 和 C++ 编写的,或者只是 Objective-C++ 可能是您想要的。把所有的Objective-C、Objective-C++、C++放在一起是多余的。

于 2010-06-15T01:50:36.553 回答