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,NO和NULL所有三线无法编译,可能是因为他们只是被定义为true,false和nil.
在我看来,很多这就是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预处理器实现.
| 归档时间: |
|
| 查看次数: |
10377 次 |
| 最近记录: |