Objective-C中的保留关键字?
在昨天的CocoaHeadsÖresund会议上,他构建了一个伟大的ObjC测验。竞争非常激烈,最后一个问题是:Objective-C为C添加了多少保留关键字 随后进行了激烈的辩论。所有人都同意Objective-C中的保留关键字?,objective-c,gcc,compiler-construction,grammar,keyword,Objective C,Gcc,Compiler Construction,Grammar,Keyword,在昨天的CocoaHeadsÖresund会议上,他构建了一个伟大的ObjC测验。竞争非常激烈,最后一个问题是:Objective-C为C添加了多少保留关键字 随后进行了激烈的辩论。所有人都同意@接口,@实现等都是预处理器指令,而不是关键字,但是像中的这样的东西怎么样?它可能是一个关键字,但不是保留关键字。例如,以下内容将在编译时不会出现错误或警告: NSArray* in; for (in in in) NSLog(@"bwahahaa"); 我们得出结论,ObjC在C中添加了no保留
@接口
,@实现
等都是预处理器指令,而不是关键字,但是像中的这样的东西怎么样?它可能是一个关键字,但不是保留关键字。例如,以下内容将在编译时不会出现错误或警告:
NSArray* in;
for (in in in)
NSLog(@"bwahahaa");
我们得出结论,ObjC在C中添加了no保留关键字,并且有人赢得了一本似乎赚得盆满钵满的书
但今天我尝试了一些更系统的对编译器的滥用,比如:
int self = 45;
self++;
int y = self;
这可以很好地编译,同样的代码可以代替self来编译BOOL、bycopy、inout、oneway、byref、SEL、
和IMP
使用id
作为变量名,编译第一行和最后一行,但不编译第二行。这同样适用于协议
,以及类
使用super
,第一行可以编译,但第二行和第三行不能编译
使用YES
、NO
和NULL
,这三行都无法编译,可能是因为它们只是被定义为true
、false
和nil
在我看来,这其中很多都是gcc变得混乱,我不确定它是否反映了Objective-C中的保留关键字。例如,为什么可以使用self
作为int的名称,而不是super
第一个赋值总是有效(除了YES、NO和NULL)这一事实似乎支持了这样一种观点,即没有一个候选关键字是在C中找不到的技术保留关键字。或者
有人能给我们一个权威的解释这个棘手的问题吗
好几个人的荣誉岌岌可危
编辑:正如尼古拉·鲁赫所指出的,我们需要对“关键词”有一个清晰的定义才能继续。Niko引用维基百科的一篇文章说,关键字是“具有特定含义的单词或标识符”
我认为使用同一条中的这一定义是合理的:
在许多语言中,例如C和
类似的环境,如C++,A
关键字是一个保留字,它
标识语法形式。话
用于控制流构造,例如
就好像,then和else是关键字一样。在里面
这些语言,关键字也不能
用作变量或变量的名称
功能
此外,正如该条所述:
通常,当程序员尝试
将关键字用于变量或
函数名,编译错误
将被触发
那么,从这个意义上讲,有没有保留的关键字?看看这些关键字,你就会知道哪些是可能的,哪些不是。由于某些“关键字”是在头文件中定义的,它们的替换可能会导致观察到的(和意外的)行为。将关键字定义为:
在计算机编程中,关键字是对编程语言具有特定含义的单词或标识符
我把它翻译成:一种语言中的关键字在语法上是非终结符。(顺便说一句,语法本身并不包含“关键字”一词,因此这里没有混淆)
系统中的终端应为:
- 空虚
- 煤焦
- 短
- int
- 长的
- 浮动
- 双重的
- 签名
- 未签名
- 身份证
- 常数
- 易变的
- 在
- 出去
- 伊努特
- 抄袭
- 拜里夫
- 单向
- 自我
- 超级
- @接口
- @结束
- @实施
- @结束
- @接口
- @结束
- @实施
- @结束
- @普罗托科
- @结束
- @阶级
您可以退房
据我所知,该文档没有将任何内容归类为“保留字”。
@implementation
、@interface
等称为“编译器指令”。所有人都同意@interface、@implementation等都是预处理器指令,而不是关键字
然后所有人都错了#import
和#pragma
是预处理器指令。
@interface、@implementation、@protocol等是Objective-C的关键字,它们是编译器指令。自从下一次扩展GCC编译Objective-C后,它们就不再是预处理器指令,没有Stepstone最初的Objective-C预处理器实现。Re:Nikolai Ruhe建议self是一个关键字
self
是类型为id
的Objective-C方法的参数(类似于\u cmd
也是类型为SEL
的参数),而不是关键字nil
是一个宏,可扩展为NULL
。我有点失望,super
没有扩展到宏,也不是参数
从维基百科条目:
Objective-C是C之上的一个薄层,而且是C的一个严格超集。可以使用Objective-C编译器编译任何C程序,并且可以在Objective-C类中自由包含C代码。
这将阻止Objective-C在语言中添加任何受限关键字。语法将超级
定义为“文字符号”终端,这是消息接收方语法中的一个特例
中的文字符号是ObjC 1.0中协议限定符的一部分,并在ObjC 2.0(没有正式语法定义AFAIK)的快速枚举语法中重用
id
与void
、char
、unsigned
、typedefed类型等一起被定义为类型说明符的一部分。如果你调用void
关键字,那么id
也是