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

use*_*057 87 c c++ objective-c

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

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

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

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

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

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

Esc*_*alo 133

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

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

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

在此输入图像描述

  • 你用什么方法声称黄色比这里的蓝色"更大"?直觉告诉我两组都是无穷无尽的. (18认同)
  • 奇怪的相似......:http://justindomke.files.wordpress.com/2008/11/scalaimage11.png (14认同)
  • 客观c ++怎么样? (13认同)
  • @wim:两者都表示为R ^ 2的不可数子集;)这是同样的技巧,你会在Q中看到N,尽管它们是相同的大小(并且N是Q的严格子集). (4认同)
  • 我正在考虑它,并意识到ObjC++集实际上并不包围所有这些.它是C++的超集,但不是ObjC的严格超集.同样的程序是合法的C,但非法的C++(绿色区域)是非法的ObjC++. (3认同)
  • @GrijeshChauhan我使用的是Inkscape. (2认同)

Car*_*rum 62

  1. 超集是什么意思?

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

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

    这是一个简单的例子:

    int *foo = malloc(12);
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 客观C以什么方式比C++更接近C哲学?

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

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

    是.

  • 主要是哲学的. (3认同)
  • 是的,那没关系.可以说,如果您愿意找出要使用的低级运行时函数,那么您也不需要GUI的Objective-C. (2认同)
  • +1很棒的解释.我认为"C哲学"的问题有点模糊,但大多数观察者可能会同意C的"目标"和ObjC的"目标"确实不同.C的目的是非常接近硬件,同时提供一些有用的可移植性抽象,而ObjC的目标是将C语言引入C语.近年来,Cocoa已经成为ObjC不可或缺的一部分,这种分歧甚至更强.C阵列和NSArray的"哲学"(设计方法)肯定是非常不同的. (2认同)
  • 这完全取决于该计划.可能你不会在Objective-C程序中做太多C风格的事情.为什么你会使用Objective-C呢? (2认同)
  • 我对有兴趣混合使用 ObjC 和 C 的人通常的建议是:不要害怕方括号,但也不要害怕圆括号。我看到太多的 C 程序员试图躲避 ObjC,也有太多的 ObjC 程序员说“dispatch_async()?但那是一个 C 函数!我不会使用它”。 (2认同)

das*_*ght 31

从头开始,C++被设计为"更好的C",修复了设计遗漏,包括真实和感知,因为C++的作者通过了这种语言.这个设计决策的结果是,X作为一个有效的C程序并不保证X在C++编译器处理时会编译,更不用说运行了.这些变化触及了诸如字符串文字(它们变成const char*),void指针赋值,enums和整数类型之间的转换,复合赋值运算符的语义等基本结构.

此外,一旦C99出现,进入更新的C标准的功能被更新的C++标准遗漏了.同样,遗漏了非常重要的语言特征 - 最值得注意的是,指定的初始化器和可变大小的阵列.

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

  • 我已经回答了这个问题,因为我知道什么是"超集",但我对Objective-C一无所知.我在另一个SO问题中看到了一个声明,即有效的C代码片段`int nil = 0; nil ++;`不编译为Objective-C.有什么问题,Objective-C是否提供可用的头文件,一旦包含,可以像C头一样完全破坏你的代码?因此,该片段的作者不应该包含它们. (4认同)
  • 顺便说一下,如果你对ObjC如何生活在C之上感兴趣,那么值得探讨一下objc.ha很少.你认为关键字(id,BOOL,Class,nil等)的东西只是简单的类型,结构,并定义.您甚至可以在pure-C中手动实现消息传递.从来没有这样做过.:D但你可以.https://github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c (4认同)
  • "nil"实际上是#define而不是关键字.你看到了问题因为包含了objc/objc.h.这类似于您尝试创建名为YES的变量时遇到的问题.(Xcode突出显示它们就像它们真的是关键字一样,因为它更容易以这种方式思考它;但它们被实现为简单的C代码.) (2认同)
  • @DanNeely:Rob Napier说"永远不会这样做"作为链接文件的评论.链接文件不是**Objective-C运行时,它只是一个快速的黑客,它显示了一些消息传递真正起作用的方式. (2认同)

Ste*_*sop 12

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

有时表示,虽然不是由C++专家认为C++是C的超集,这是不准确的,这就是为什么你报的是使两相比较的一个大问题.


Kaz*_*Kaz 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.