2009-12-09 82 views
16

昨天在CocoaHeadsÖresund会议上,peylow已经构建了一个伟大的ObjC测验。当最终的问题进行评估时,竞争非常激烈,三人留下了相同的分数:Objective-C添加到C的保留关键字有多少?Objective-C中的保留关键字?

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

NSArray* in; 
for (in in in) 
    NSLog(@"bwahahaa"); 

我们得出的结论是ObjC增加没有保留关键字C,有人赢得了一个看似很好赚来的书。

但今天我试着编译一些更为系统的滥用,试图像这样的事情:

int self = 45; 
self++; 
int y = self; 

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

使用id作为变量名,第一行和最后一行编译,但不是第二行。 ProtocolClass也是如此。

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

随着YESNO,并NULL,所有三行无法编译,可能是因为他们只是定义为truefalsenil

它看起来像我很多这是海湾合作委员会越来越困惑,我不太确定它反映什么是和不是保留在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

一些相关材料在这里:http://stackoverflow.com/questions/25749/what-does-the-symbol-represent-in-objective-c – Felixyz 2009-12-19 00:55:38

回答

1

看一看Objective-C Programming Language会给你一些关于可能与否的线索。由于某些“关键字”是在头文件中定义的,因此它们的替换可能会导致观察到(和意外)的行为。

+0

没错。所以问题是:在Objective-C中是否存在任何真正的保留关键字(超出了C中已经保留的那些关键字)。 – Felixyz 2009-12-09 12:58:13

+1

没有其他语言意义上的保留关键字。它更像是可以与你的代码严重交互的定义。这一切都取决于预处理器的工作。 – 2009-12-09 13:54:59

1

Wikipedia关键字定义如下:

在计算机程序,关键字是具有特定意义的编程语言中的字或标识符。

我会把它翻译成:一种语言中的关键字是语法中的非终端。 (顺便说一句,该语法本身不包含“关键字”一词,因此不存在混淆)。

grammar端子将是:

  • 空隙
  • INT
  • 浮子
  • 签署
  • 无符号
  • ID
  • 常量
  • 挥发性
  • INOUT
  • bycopy
  • 按地址
  • 单向
  • 超级
  • @interface
  • @end
  • @implementation
  • @end
  • @interface
  • @end
  • @implementation
  • @end
  • @protoco
  • @end
  • @class
+0

问题是哪些保留关键字ObjC可能**将**添加到C.正如您在示例中看到的,您可以自由使用“in”作为变量的名称,因此它显然不会被视为保留关键字。 – Felixyz 2009-12-09 12:57:07

+1

我的意思是,“int float = 45;”这个事实无法编译,而“int id = 45;”编译罚款告诉我们一些事情。 – Felixyz 2009-12-09 13:01:14

+0

他们不是“例子”。据我所知,这是完整的清单。而且,这取决于您想要调用关键字的内容。我给你我对这个问题的回答。 – nes1983 2009-12-09 13:09:27

1

你可以检查出The Objective-C Programming Language

据我所知,该文件没有将任何东西归类为“保留字”。 @implementation,@interface等被称为“编译器指令”。

9

大家一致认为,@interface,@implementation等都是预处理器指令,而不是关键字

然后所有的人都错了。 #import#pragma是预处理指令。 @interface, @implementation, @protocol等是Objective-C的关键词,它们是编译器指令。由于NeXT扩展了GCC以在没有Stepstone最初的Objective-C预处理器实现的情况下编译Objective-C,所以它们不是预处理器指令。

+0

然后这就意味着@interface是一个关键字(在上面的编辑中指出),但id不是,因为编译器拒绝编译,例如“int @interface = 1;”但很高兴使用id作为int的名称。但是再次,编译器也不允许“int @icecream = 1;”。那么,我们在哪里? #import - 预处理指令 @interface - 编译指令 @ - 保留字符 id/self/in - 在某些情况下特殊含义但不保留 – Felixyz 2009-12-09 14:39:36

+0

id是typedef。你可以在objc.h中找到它 – NSResponder 2009-12-09 15:12:44

4

重新:尼古拉汝河的建议自我是一个关键字

self被一个参数id类型的一个Objective-C方法(类似于_cmd如何也是PARAM,SEL类型的),而不是一个关键字。 nil是一个扩展到NULL的宏。我有点失望,super不扩展到一个宏,也不是一个参数。

从维基百科条目:

目的-C是基于C的顶部上的薄层,而且是C的一个严格的超是可能的编译任何C程序用一个Objective-C编译器,和在Objective-C类中自由地包含C代码。

这将阻止Objective-C向该语言添加任何受限关键字。

+0

这是一个很好的观点,尽管gcc显然没有完全遵守限制。 – Felixyz 2009-12-09 17:19:00

+0

结论是不正确的。一种语言的超集可以使用原始语言中非法的术语添加关键字。而这正是Objective-C所做的。 – 2009-12-09 20:20:56

+0

关于'super'不是宏:编译器必须能够识别'super',因为它必须使用正确的消息类型(调用'objc_msgSendSuper'而不是'objc_msgSend')。 'super'指向与'self'相同的对象,因此没有太多的意义使它成为另一个论点。 – 2009-12-09 20:29:10

2

文法Appendix B of the original 1995 booksuper定义为“文字符号”终端,这是一个特殊情况在消息接收机语法。

in文字符号是ObjC 1.0 协议限定符的一部分,并且在ObjC 2.0(不具有正式语法定义AFAIK)快速枚举语法被重新使用。如果调用void关键字

id被定义为一起voidcharunsigned,typedef操作类型等类型说明符的一部分,那么id过。