关于gcc:Objective-C中的保留关键字?

Reserved keywords in Objective-C?

在可可头?在昨天的会议上,佩洛做了一个很好的OBJC测试。当最后一个问题要被评估时,竞争激烈,剩下三个人的得分相同:Objective-C在C中添加了多少保留关键字?

随后进行了激烈的辩论。所有人都同意@interface@implementation等都是预处理器指令,而不是关键字,但是像in这样的指令怎么样?它可能是关键字,但不是保留关键字。例如,以下代码编译时不会出现错误或警告:

1
2
3
NSArray* in;
for (in in in)
   NSLog(@"bwahahaa");

我们得出的结论是,objc没有在c中添加保留的关键字,并且有人赢得了一本似乎收入颇丰的书。

但是今天我尝试了一些更系统的对编译器的滥用,比如:

1
2
3
int self = 45;
self++;
int y = self;

这编译得很好,同样的代码可以代替self替换BOOL, bycopy, inout, oneway, byref, SEL,IMP

使用id作为变量名,编译第一行和最后一行,但不编译第二行。同样适用于ProtocolClass

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

对于YESNONULL,这三行都无法编译,可能是因为它们只是定义为truefalsenil

在我看来,很多这是GCC变得困惑,我不太确定它反映了什么是和不是Objective-C中的保留关键字。例如,为什么可以使用self作为in t的名称,而不是super

第一个任务总是有效的(除了有"是"、"否"和"空")这一事实似乎支持这样一种观点:没有一个候选人在技术上是保留的关键字,在C中找不到。还是?

有人能对这个棘手的问题给我们一个权威的解释吗?

几个人的荣誉危在旦夕。

编辑:正如Nikolai Ruhe指出的,我们需要一个"关键字"的清晰定义来继续。尼科引用维基百科的一篇文章说,关键字是"一个有特殊含义的词或标识符"。

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

In many languages, such as C and
similar environments like C++, a
keyword is a reserved word which
identifies a syntactic form. Words
used in control flow constructs, such
as if, then, and else are keywords. In
these languages, keywords cannot also
be used as the names of variables or
functions.

此外,正如本文所述:

Typically, when a programmer attempts
to use a keyword for a variable or
function name, a compilation error
will be triggered.

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


所有人都同意@interface、@implementation等都是预处理器指令,而不是关键字。

然后一切都错了。#import#pragma是预处理器指令。@interface, @implementation, @protocol等是objective-c的关键字,是编译指令。自从下一次扩展GCC来编译Objective-C,而没有Stepstone最初的Objective-C预处理器实现之后,它们就不再是预处理器指令了。


回复:Nikolai Ruhe认为自我是一个关键词

selfid型(类似于_cmd也是参数,SEL型)而不是关键字的客观c方法的参数。nil是一个扩大到NULL的宏。我有点失望,因为super没有扩展到宏,也不是一个参数。

从维基百科条目:

Objective-C is a thin layer on top of C, and moreover is a strict superset of C. It is possible to compile any C program with an Objective-C compiler, and to freely include C code within an Objective-C class.

这将阻止Objective-C在语言中添加任何受限制的关键字。


1995年原著附录B中的语法将super定义为"文字符号"终端,这是消息接收者语法中的一个特例。

in文字符号是objc 1.0中协议限定符的一部分,并在objc 2.0中的快速枚举语法中重用(objc 2.0没有正式的语法定义afaik)。

id被定义为类型说明符的一部分,与voidcharunsigned和typefed类型等一起。如果您调用void作为关键字,那么id也是。


您可以查看Objective-C编程语言。

据我所知,该文档没有将任何内容归类为"保留字"。@implementation@interface等称为"编译器指令"。


维基百科将关键字定义为:

In computer programming, a keyword is a word or identifier that has a particular meaning to the programming language.

我会把它翻译成:语言中的关键字在语法上是非终结词。(顺便说一句,语法本身不包含"关键字"这个词,所以没有混淆)。

语法中的终端是:

  • 无效
  • 烧焦
  • 短的
  • int
  • 长的
  • 浮动
  • 双重的
  • 签署
  • 无符号
  • 身份证件
  • 康斯特
  • 不稳定的
  • 在里面
  • 外面的
  • 输入输出
  • 副复制品
  • 拜雷夫
  • 单向
  • 自己
  • 超级的
  • @接口
  • @结束
  • @实现
  • @结束
  • @接口
  • @结束
  • @实现
  • @结束
  • @协议
  • @结束
  • @班


看一下Objective-C编程语言,你会发现什么是可能的,什么是不可能的。由于在头文件中定义了一些"关键字",它们的替换可能导致观察到(和意外)的行为。