Objective-C中保留的关键字?

时间:2009-12-09 12:36:32

标签: objective-c gcc compiler-construction grammar keyword

昨天在CocoaHeadsÖresund会议上,peylow构建了一个很棒的ObjC测验。竞争非常激烈,当评估最后一个问题时,有三个人留下了相同的分数:Objective-C有多少保留关键字添加到C?

随后进行了一些激烈的辩论。所有人都认为@interface@implementation等都是预处理器指令而不是关键字,但in之类的怎么样?它可能是关键字,但它不是保留的关键字。例如,以下内容将编译时没有错误或警告:

NSArray* in;
for (in in in)
   NSLog(@"bwahahaa");

我们得出结论,ObjC为C添加了 no 保留关键字,有人赢得了一本看似很好的书。

但今天我尝试通过这样的方式对编译器进行更系统的滥用:

int self = 45;
self++;
int y = self;

编译得很好,同样的代码可以替换BOOL, bycopy, inout, oneway, byref, SEL,IMP的自我。

使用id作为变量名,第一行和最后一行编译,但不是第二行。 ProtocolClass也是如此。

使用super,第一行编译,但不编译第二行和第三行。

使用YESNONULL,所有三行都无法编译,可能是因为它们只是定义为truefalsenil

在我看来,很多这就是gcc感到困惑,我不太确定它反映的是什么是Objective-C中的保留关键字。例如,为什么可以使用self作为int的名称,而不是super

第一个赋值始终有效(除了带有YES,NO和NULL)这一事实似乎支持这样一种观点,即没有一个候选词在技术上是保留在C中找不到的关键词。或者?

有人可以给我们一个关于这个棘手问题的权威解释吗?

有几个人的荣誉受到威胁。

编辑:正如Nikolai Ruhe指出的那样,我们需要明确定义“关键字”才能继续。 Niko引用维基百科的一篇文章说,关键词是“具有特定含义的词或标识符”。

我认为在同一篇文章中使用这个定义是合理的:

  

在许多语言中,例如C和   像C ++这样的类似环境   关键字是保留字   识别句法形式。话   用于控制流构造,例如   好像,然后,否则是关键字。在   这些语言,关键词也不能   用作变量的名称或   功能

此外,正如文章所述:

  

通常,当程序员尝试时   使用关键字作为变量或   函数名称,编译错误   将被触发。

从这个意义上说,是否有任何保留的关键字是predefined in the language’s formal specifications and cannot be used as a user-defined name

6 个答案:

答案 0 :(得分:10)

所有人都同意@interface,@ implementation等都是预处理器指令而不是关键字

然后一切都弄错了。 #import#pragma是预处理程序指令。  @interface, @implementation, @protocol等等是Objective-C的关键字,它们是编译器指令。它们不是预处理器指令,因为NeXT扩展GCC以编译Objective-C而没有Stepstone最初的Objective-C预处理器实现。

答案 1 :(得分:4)

Re:Nikolai Ruhe建议self是一个关键词

self是类型为id的Objective-C方法的参数(类似于_cmd也是类型为SEL的参数),而不是关键字。 nil是一个扩展为NULL的宏。我有点失望,super没有扩展到宏,也不是参数。

来自维基百科条目:

Objective-C是一个位于C之上的薄层,而且是C的严格超集。可以使用Objective-C编译器编译任何C程序,并在Objective-C中自由包含C代码类。

这将阻止Objective-C向该语言添加任何受限制的关键字。

答案 2 :(得分:2)

Appendix B of the original 1995 book中的语法将super定义为“文字符号”终端,它是消息 receiver 语法中的特例。

in文字符号是ObjC 1.0中 protocol-qualifier 的一部分,并在ObjC 2.0中快速枚举语法中重用(没有正式的语法定义AFAIK)。

id被定义为 type-specifier 的一部分,旁边是voidcharunsigned,typedefed类型等。如果您致电void一个关键字,然后id也是。

答案 3 :(得分:1)

查看Objective-C Programming Language可以找到有关可能与否的线索。由于某些“关键字”是在头文件中定义的,因此它们的替换可能会导致观察到的(和意外的)行为。

答案 4 :(得分:1)

Wikipedia将关键字定义为:

  

在计算机编程中,关键字是对编程语言具有特定含义的词或标识符。

我将其翻译为:语言中的关键字在其语法中是非终结符。 (顺便说一句,语法本身不包含单词“keyword”,所以没有混淆)。

grammar中的终端将是:

  • 空隙
  • INT
  • 签名
  • 无符号
  • ID
  • 常量
  • 易失性
  • INOUT
  • bycopy
  • 按地址
  • 单向
  • @interface
  • @end
  • @implementation
  • @end
  • @interface
  • @end
  • @implementation
  • @end
  • @protoco
  • @end
  • @class

答案 5 :(得分:1)

您可以查看The Objective-C Programming Language

据我所知,该文件没有将任何内容归类为“保留字”。 @implementation@interface等称为“编译器指令”。