代码之家  ›  专栏  ›  技术社区  ›  Felixyz

objective-c中的保留关键字?

  •  16
  • Felixyz  · 技术社区  · 15 年前

    在昨天的Cocoaheads会议上, peylow 设计了一个很棒的objc测验。当最后一个问题要被评估时,竞争非常激烈,三个人的得分都是一样的:objective-c在c中加了多少保留关键字?

    随后进行了激烈的辩论。大家都同意 @interface , @implementation etc都是预处理指令而不是关键字,但是 in ?可能是关键字,但不是 保留的 关键字。例如,以下内容将编译而不出现错误或警告:

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

    我们的结论是,objc 保留了C的关键字,有人赢得了一本看似赚得盆满钵满的书。

    但今天我试着对编译器进行一些更系统的滥用,比如:

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

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

    使用 id 作为变量名,第一行和最后一行编译,而不是第二行。同样的道理 Protocol Class .

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

    YES , NO NULL ,这三行代码都无法编译,可能是因为它们的定义是 true , false 以及 nil .

    在我看来,这其中有很多是gcc混淆了,我不确定它是否反映了objective-c中的保留关键字。 self 作为int的名称,但不是 超级的 ?

    第一个作业总是有效的(除了yes、no和null)这一事实似乎支持这样一种观点,即没有一个候选词是c.或c.中没有的技术保留关键字。

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

    有几个人的荣誉岌岌可危。

    编辑:正如尼古拉鲁厄所指出的,我们需要一个明确的“关键字”定义来继续。尼科引用维基百科的一篇文章说,关键字是“具有特定含义的单词或标识符”。

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

    在许多语言中,如C和 类似的环境,如C++,A 关键字是一个保留字 标识句法形式。话 用于控制流构造,例如 好像,然后,和其他都是关键字。在 这些语言、关键字也不能 用作变量名或 功能。

    此外,正如该条所述:

    通常,当程序员试图 将关键字用于变量或 函数名,编译错误 将被触发。

    从这个意义上说,有没有保留的关键字 predefined in the language’s formal specifications and cannot be used as a user-defined name ?

    6 回复  |  直到 8 年前
        1
  •  10
  •   NSResponder    15 年前

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

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

        2
  •  4
  •   jon hohle    15 年前

    回复:尼古拉鲁厄认为自我是关键词

    self 是类型为的objective-c方法的参数 id (类似于 _cmd 也是参数,类型为 SEL )不是关键字。 nil 是一个宏,它扩展到 NULL . 我有点失望 super 不展开到宏,也不是参数。

    从维基百科条目:

    objective-c是c之上的一个薄层,而且是c的严格超集,用objective-c编译器可以编译任何c程序,并且可以在objective-c类中自由地包含c代码。

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

        3
  •  2
  •   Kornel    15 年前

    语法 Appendix B of the original 1995 book 定义 super 作为“文字符号”终端,它在消息中是一种特殊情况 接受者 语法。

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

    id 被定义为 类型说明符 沿着 void , char , unsigned ,如果您调用 无效 一个关键字,然后 身份证件 也是。

        4
  •  1
  •   Laurent Etiemble    15 年前

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

        5
  •  1
  •   nes1983    15 年前

    Wikipedia 将关键字定义为:

    在计算机程序设计中,关键字是对程序设计语言有特殊意义的词或标识符。

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

    中的终端 grammar 将是:

    • 无效
    • 烧焦
    • 短的
    • int
    • 长的
    • 浮动
    • 双重的
    • 签署
    • 未签名的
    • 身份证件
    • 常量
    • 不稳定的
    • 在里面
    • 外面的
    • 输入输出
    • 副复制品
    • 拜雷夫
    • 单向
    • 自己
    • 超级的
    • @接口
    • @结束
    • @实施
    • @结束
    • @接口
    • @结束
    • @实施
    • @结束
    • @协议
    • @结束
    • @班
        6
  •  1
  •   Kristopher Johnson    15 年前

    你可以退房 The Objective-C Programming Language .

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