在昨天的 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
,第一行编译,但不是第二和第三行。
使用YES
、NO
和NULL
,所有三行都无法编译,可能是因为它们刚刚定义为true
、false
和nil
。
在我看来,这其中很多是 gcc 变得混乱,我不太确定它反映了什么是和不是 Objective-C 中的保留关键字。例如,为什么可以self
用作 int 的名称,但不能super
?
第一个赋值总是有效的事实(除了 YES、NO 和 NULL)似乎支持这样一种观点,即没有一个候选是在 C 中找不到的技术保留关键字。或者?
有人可以对这个棘手的问题给我们一个权威的解释吗?
几个人的荣誉岌岌可危。
编辑:正如 Nikolai Ruhe 指出的那样,我们需要对“关键字”进行明确定义才能继续进行。Niko 引用了 Wikipedia 的一篇文章,称关键字是“具有特定含义的单词或标识符”。
我认为使用同一篇文章中的这个定义是合理的:
在许多语言中,例如 C 和类似的环境(如 C++),关键字是标识句法形式的保留字。控制流结构中使用的词,例如 if、then 和 else 是关键字。在这些语言中,关键字也不能用作变量或函数的名称。
此外,正如文章所述:
通常,当程序员尝试对变量或函数名使用关键字时,会触发编译错误。
那么,从这个意义上说,是否有任何保留关键字在语言的正式规范中预定义并且不能用作用户定义的名称?