“Objective-C比C ++更严格地说是C的超集”是什么意思?

从我读到的内容来看: Objective-C为什么在苹果社区以外不受欢迎?

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

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

超集是什么意思? Objective-C将以何种方式更接近于C / C向后兼容? Objective-C比C ++更接近C的哲学呢?

任何C程序都可以在没有被Objective-C编译器修改的情况下编译(100%兼容性)吗?

这是一个关于编程语言devise和兼容性的问题,而不是一场更好的战争。

我准备了一个简单的图表; 这不是很漂亮,但希望得到的重点:

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

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

在这里输入图像说明

  1. 超集是什么意思?

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

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

    这是一个简单的例子:

    int *foo = malloc(12); 

    在C和Objective-C中编译,但不在C ++中编译。 当然,还有其他的例子。

  3. Objective-C比C ++更接近C的哲学呢?

    所有 – Objective-C是C的一个严格的超集。

  4. 任何C程序都可以在没有被Objective-C编译器修改的情况下编译(100%兼容性)吗?

    是。

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

而且,一旦C99出现,使得它成为更新后的C标准的function被从更新的C ++标准中排除。 同样,非常重要的语言特征被排除在外 – 最显着的是,指定的初始化程序和可变大小的数组。

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

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

有时候有人说,虽然不是C ++专家,但是C ++是C的超集。这是不准确的,这就是为什么你的引用对这两者进行比较的原因。

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

  • 使用字符@ 。 这个字符目前在C语言中没有使用。
  • 一个简单的调用方法的语法扩展, [obj method:argument] 。 在C中,方括号用于数组下标,因此这是无效的C语法。 基于无效语法的扩展不会改变主机语言中任何有效的含义。

很容易看出,使用Objective C扩展的程序不pipe是多么简单,都可以成为严格符合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 ++关键字作为标识符的C程序,例如classvirtual 。 Objective C不会引入任何保留的关键字。 它具有由@字符引入的新关键字,如@interface