昨天在CocoaHeadsÖresund会议上,peylow已经构建了一个伟大的ObjC测验。当最终的问题进行评估时,竞争非常激烈,三人留下了相同的分数:Objective-C添加到C的保留关键字有多少?Objective-C中的保留关键字?
随后发生了一些激烈的辩论。大家一致认为@interface
,@implementation
等都是预处理器指令而不是关键字,但是怎么样像in
?它可能是一个关键字,但它不是一个保留的关键字。例如,下面将编译没有错误或警告:
NSArray* in;
for (in in in)
NSLog(@"bwahahaa");
我们得出的结论是ObjC增加没有保留关键字C,有人赢得了一个看似很好赚来的书。
但今天我试着编译一些更为系统的滥用,试图像这样的事情:
int self = 45;
self++;
int y = self;
,编译的罚款,并在相同的代码工作替换为自己和BOOL, bycopy, inout, oneway, byref, SEL,
IMP
。
使用id
作为变量名,第一行和最后一行编译,但不是第二行。 Protocol
和Class
也是如此。
使用super
,第一行编译,但不是第二行和第三行。
随着YES
,NO
,并NULL
,所有三行无法编译,可能是因为他们只是定义为true
,false
和nil
。
它看起来像我很多这是海湾合作委员会越来越困惑,我不太确定它反映什么是和不是保留在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?
一些相关材料在这里:http://stackoverflow.com/questions/25749/what-does-the-symbol-represent-in-objective-c – Felixyz 2009-12-19 00:55:38