Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C中的保留关键字?_Objective C_Gcc_Compiler Construction_Grammar_Keyword - Fatal编程技术网

Objective-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保留

在昨天的CocoaHeadsÖresund会议上,他构建了一个伟大的ObjC测验。竞争非常激烈,最后一个问题是:Objective-C为C添加了多少保留关键字

随后进行了激烈的辩论。所有人都同意
@接口
@实现
等都是预处理器指令,而不是关键字,但是像
中的
这样的东西怎么样?它可能是一个关键字,但不是保留关键字。例如,以下内容将在编译时不会出现错误或警告:

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
      也是