88

从我那里读到的内容:为什么Objective-C在Apple社区之外不是很受欢迎?

Objective-C 是 C 的超集(实际上比 C++ 严格得多),因此不会出现向后兼容性的问题。你可以在 C 中做的任何事情都可以在 Objective-C 中做。

成为超集是二元的,就像怀孕一样。Obj-C 是 C 的超集,而 C++ 不是。

他们所说的超集是什么意思?Objective-C 以何种方式更接近//向后兼容 C?Objective-C 在哪些方面比 C++ 更接近 C 哲学?

任何 C 程序都可以通过 Objective-C 编译器(100% 兼容性)不加修改地编译吗?

这更多是关于编程语言设计和兼容性的问题,而不是关于哪个更好的战争。

4

5 回答 5

136

我准备了一个简单的图表;它不是很漂亮,但希望能明白这一点:

  • 红色:在 C、C++ 和 Objective-C 中有效的所有程序的集合(相对较小)
  • 绿色:在 C 和 Objective-C 中有效但在 C++ 中无效的所有程序的集合(甚至更小)
  • 灰色:在 Objective C 和 C++ 中有效但在 C 中无效的所有程序集(据我所知为空)
  • 蓝色:仅在 Objective C 中有效的所有程序集(相对较大)
  • 黄色:仅在 C++ 中有效的所有程序的集合(最大)

有效 C 程序集(红色和绿色)是有效 Objective C 程序集(蓝色)的严格子集

在此处输入图像描述

于 2013-10-14T19:06:02.003 回答
63
  1. 他们所说的超集是什么意思?

    他们的意思是严格的超集。任何有效的 C 程序都将使用 Objective-C 编译器进行编译。一些有效的 C 程序无法使用 C++ 编译器进行编译。

  2. Objective-C 以何种方式更接近//向后兼容 C?

    这是一个简单的例子:

    int *foo = malloc(12);
    

    用 C 和 Objective-C 编译,但不能用 C++ 编译。当然,还有其他例子。

  3. Objective-C 在哪些方面比 C++ 更接近 C 哲学?

    全部 - Objective-C 是 C 的严格超集。

  4. 任何 C 程序都可以通过 Objective-C 编译器(100% 兼容性)不加修改地编译吗?

    是的。

于 2013-10-14T17:53:59.560 回答
32

从头开始,C++ 被设计为“更好的 C”,修复了设计遗漏,无论是真实的还是感知的,正如 C++ 的作者所经历的那样。这一设计决定的结果是,X作为一个有效的 C 程序并不能保证X在由 C++ 编译器处理时能够编译,更不用说运行了。这些更改涉及字符串文字(它们变成const char*)、指针赋值、s 和整数类型void之间的转换、复合赋值运算符的语义等基本结构。enum

此外,一旦 C99 出现,使其成为更新的 C 标准的特性就被排除在更新的 C++ 标准之外。同样,非常重要的语言特性被遗漏了——最值得注意的是,指定的初始化器和可变大小的数组。

相比之下,Objective C 被定位为 C 的超集,要求所有有效的 C 程序都可以使用 Objective C 编译器进行编译。

于 2013-10-14T17:59:12.500 回答
12

“Objective-C 是 C 的超集”意味着每个有效的 C 程序都是有效的 Objective-C 程序(含义相同)。

有时说,尽管不是 C++ 专家,但 C++ 是 C 的超集。这是不准确的,这就是为什么你的引文对两者进行了很大的比较。

于 2013-10-14T17:56:55.453 回答
9

Objective C 是一组向后兼容的 C 扩展。这是可能的,因为 Objective C 的特性以两种非常简单的方式分隔:

  • 字符的使用@。C 语言中当前未使用此字符。
  • 调用方法的简单句法扩展,[obj method:argument]. 在 C 中,方括号以一种非常特殊的方式用于数组下标,因此这是无效的 C 语法。建立在无效语法上的扩展不会改变任何在宿主语言中有效的含义。

很容易看出,任何使用 Objective C 扩展的程序都不能成为严格符合 ISO C 的程序,无论多么简单。此外,根据定义,每个 ISO C 程序都可以声明为有效的 Objective C 程序。Objective C 可以轻松地跟随 C99 和 C11 等开发。

另一方面,C++ 不仅仅是对 C 的扩展;它是一种不同的语言,它改变了 C 的某些语法的含义。C++ 和 C 是分开维护的,因此它们的关系会随着时间而变化。例如,C 获得了 C++ 中完全没有的新特性,并且很可能不会进入 C++,例如 C99 可变长度数组。C++ 不能轻易获得新的 C 特性。

如果您编写一个可移植的 C 程序,它应该同时是一个 Objective C 程序。但需要额外注意,使其也是具有相同含义的 C++ 程序。(这种做法并非闻所未闻,它所需的方言非正式地称为“Clean C”)。

C 程序在被视为 C++ 时中断的一个简单示例是任何使用 C++ 关键字作为标识符的 C 程序,例如classor virtual。Objective C 没有引入任何保留关键字。它具有由@角色引入的新关键字,例如@interface.

于 2013-10-15T02:04:19.173 回答