昨天在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
作为变量名,第一行和最后一行编译,但不是第二行。 Protocol
和Class
也是如此。
使用super
,第一行编译,但不编译第二行和第三行。
使用YES
,NO
和NULL
,所有三行都无法编译,可能是因为它们只是定义为true
,false
, nil
。
在我看来,很多这就是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?
答案 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 的一部分,旁边是void
,char
,unsigned
,typedefed类型等。如果您致电void
一个关键字,然后id
也是。
答案 3 :(得分:1)
查看Objective-C Programming Language可以找到有关可能与否的线索。由于某些“关键字”是在头文件中定义的,因此它们的替换可能会导致观察到的(和意外的)行为。
答案 4 :(得分:1)
Wikipedia将关键字定义为:
在计算机编程中,关键字是对编程语言具有特定含义的词或标识符。
我将其翻译为:语言中的关键字在其语法中是非终结符。 (顺便说一句,语法本身不包含单词“keyword”,所以没有混淆)。
grammar中的终端将是:
答案 5 :(得分:1)
您可以查看The Objective-C Programming Language。
据我所知,该文件没有将任何内容归类为“保留字”。 @implementation
,@interface
等称为“编译器指令”。