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

时间:2013-10-14 17:52:43

标签: c++ objective-c c

从我在那里读到:Why is Objective-C not very popular outside of the Apple community?

  

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

     

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

超集是什么意思? Objective-C以什么方式更接近//向后兼容C?客观C以什么方式比C ++更接近C哲学?

是否可以编译任何C程序而无需通过Objective-C编译器进行修改(100%兼容性)?

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

5 个答案:

答案 0 :(得分:133)

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

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

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

enter image description here

答案 1 :(得分:62)

  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%兼容性)?

答案 2 :(得分:31)

从头开始,C ++被设计为“更好的C”,修复了设计遗漏,包括真实和感知,因为C ++的作者通过了这种语言。这个设计决策的结果是X是一个有效的C程序,并不能保证{C}编译器在处理X时会编译,更不用说运行了。这些更改触及了诸如字符串文字(它们变为const char*),void指针的分配,enum和整数类型之间的转换,semantics of compound assignment operators等基本结构。

此外,一旦C99出现,从更新的C ++标准中省略了使其成为更新的C标准的功能。同样,遗漏了非常重要的语言特征 - 最值得注意的是,指定的初始化器和可变大小的阵列。

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

答案 3 :(得分:12)

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

有时说,虽然不是C ++专家,但C ++是C的超集。这不准确,这就是为什么你的报价比较两者的原因。

答案 4 :(得分: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 ++程序。 (这种做法并非闻所未闻,而且它所要求的方言被非正式地称为“清洁C”)。

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