16

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

随后进行了激烈的辩论。所有人都同意@interface@implementation等等都是预处理器指令而不是关键字,但是像这样的东西in呢?它可能是关键字,但不是保留关键字。例如,以下将编译没有错误或警告:

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

我们得出结论,ObjC没有为 C 添加保留关键字,并且有人赢得了一本看似来之不易的书。

但是今天我通过尝试这样的事情尝试了对编译器的一些更系统的滥用:

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

编译得很好,并且相同的代码可以将 self 替换为BOOL, bycopy, inout, oneway, byref, SEL,and IMP

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

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

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

在我看来,这其中很多是 gcc 变得混乱,我不太确定它反映了什么是和不是 Objective-C 中的保留关键字。例如,为什么可以self用作 int 的名称,但不能super

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

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

几个人的荣誉岌岌可危。

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

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

在许多语言中,例如 C 和类似的环境(如 C++),关键字是标识句法形式的保留字。控制流结构中使用的词,例如 if、then 和 else 是关键字。在这些语言中,关键字也不能用作变量或函数的名称。

此外,正如文章所述:

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

那么,从这个意义上说,是否有任何保留关键字在语言的正式规范中预定义并且不能用作用户定义的名称

4

6 回答 6

10

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

然后大家都错了。#import 并且#pragma是预处理器指令。 @interface, @implementation, @protocol等等是Objective-C的关键字,它们是编译器指令。自从 NeXT 扩展 GCC 以在没有 Stepstone 的原始 Objective-C 预处理器实现的情况下编译 Objective-C 以来,它们就不再是预处理器指令。

于 2009-12-09T14:26:08.170 回答
4

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

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

从维基百科条目:

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

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

于 2009-12-09T17:07:27.783 回答
2

维基百科将关键字定义为:

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

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

语法中的终端将是:

  • 空白
  • 字符
  • 短的
  • 整数
  • 漂浮
  • 双倍的
  • 未签名
  • ID
  • 常量
  • 易挥发的
  • 出去
  • 进出
  • 复制
  • 引用
  • 单程
  • 自己
  • 极好的
  • @界面
  • @结尾
  • @执行
  • @结尾
  • @界面
  • @结尾
  • @执行
  • @结尾
  • @protoco
  • @结尾
  • @班级
于 2009-12-09T12:50:55.080 回答
2

1995 年原书附录 B 中的语法定义为“文字符号”终端,它是消息接收器语法super中的一个特例。

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

id在, , , typedefed 类型等旁边被定义为类型说明符的一部分。如果您调用关键字,那么也是。voidcharunsignedvoidid

于 2010-03-22T15:51:51.967 回答
1

看一下Objective-C 编程语言会给你一些关于什么是可能的或不可能的线索。由于某些“关键字”是在头文件中定义的,因此它们的替换可能会导致观察到(和意外)的行为。

于 2009-12-09T12:50:02.323 回答
1

您可以查看The Objective-C Programming Language

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

于 2009-12-09T12:52:18.747 回答