Objective-C中保留的关键字?

Fel*_*xyz 16 compiler-construction grammar gcc objective-c keyword

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

随后进行了一些激烈的辩论.所有人都认为@interface,@implementation等等都是预处理器指令而不是关键字,但是怎么样in?它可能是一个关键字,但它不是保留关键字.例如,以下将编译没有错误或警告:

NSArray* in;
for (in in in)
   NSLog(@"bwahahaa");
Run Code Online (Sandbox Code Playgroud)

我们的结论是,ObjC 没有为C 添加保留关键字,有人赢得了一本看似很好的书.

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

int self = 45;
self++;
int y = self;
Run Code Online (Sandbox Code Playgroud)

这编译罚款,而相同的代码工作替换为自己BOOL, bycopy, inout, oneway, byref, SEL,IMP.

使用id变量名称,第一行和最后一行编译,但不是第二行.同样的Protocol,和Class.

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

随着YES,NONULL所有三线无法编译,可能是因为他们只是被定义为true,falsenil.

在我看来,很多这就是gcc变得困惑,我不太确定它反映的是什么是Objective-C中的保留关键字.例如,为什么可以将其self用作int的名称,但不是super吗?

第一个赋值始终有效(除了带有YES,NO和NULL)这一事实似乎支持这样一种观点,即没有一个候选是C中没有的技术上保留的关键字.或者?

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

几个人的荣誉受到威胁.

编辑:正如Nikolai Ruhe指出的那样,我们需要明确定义"关键字"才能继续.Niko引用维基百科的一篇文章称关键词是"具有特定含义的词或标识符".

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

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

此外,正如文章所述:

通常,当程序员尝试使用关键字作为变量或函数名称时,将触发编译错误.

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

NSR*_*der 10

所有人都认为@interface,@ implementation等都是预处理器指令而不是关键字

然后一切都弄错了.#import 并且#pragma是预处理程序指令. @interface, @implementation, @protocol等等是Objective-C的关键字,它们是编译器指令.它们不是预处理器指令,因为NeXT扩展GCC以编译Objective-C而没有Stepstone最初的Objective-C预处理器实现.


Lau*_*ble 1

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