昨天在CocoaHeads Öresund会议上,peylow建立了一个很棒的ObjC测验。竞争非常激烈,当最后一个问题需要评估时,有三个人得分相同:Objective-C添加了多少个保留关键字到C语言中?
随后进行了一些激烈的辩论。所有人都认为
我们得出结论,ObjC没有为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,
和IMP
,同样能够正常工作。
使用id作为变量名,第一行和最后一行可以编译通过,但是第二行不能。Protocol和Class也是一样的。
使用super,第一行可以编译通过,但是第二行和第三行不行。
对于YES、NO和NULL,这三行都无法编译通过,可能是因为它们只被定义为true
、false
和nil
。
在我看来,很多问题都是因为gcc混淆了判断,我不确定这是否反映了Objective-C中哪些是保留关键字。例如,为什么可以将self用作int类型的名称,但不能用super?
第一次赋值总是有效的(除了YES、NO和NULL),这似乎支持没有候选项是技术上未被保留的C关键字的想法。或者呢?
请有权威背景的人士给出关于这个棘手问题的明确解释。
有几个人的荣誉受到了挑战。
编辑:正如Nikolai Ruhe指出的那样,我们需要一个清晰的“关键字”定义才能继续。Niko引用了维基百科上的一篇文章,其中说关键字是“具有特定含义的单词或标识符”。
我认为可以使用同一篇文章中的这个定义:
在许多语言中,例如C和类似的环境(如C ++),关键字是标识语法形式的保留字。用于控制流结构的单词,例如if、then和else是关键字。在这些语言中,关键字不能用作变量或函数的名称。此外,正如文章所述:
通常,当程序员尝试将关键字用作变量或函数名称时,会触发编译错误。
因此,是否有在语言的正式规范中预定义的保留关键字,不能用作用户定义的名称?