如果在变量之前放置多个静态修饰符,这意味着什么?

时间:2012-08-15 21:05:34

标签: objective-c ios c

我只是在Xcode中鬼混,我发现以下语句编译并且它甚至没有发出警告,更不用说错误了:

static static static int static long static var[5];

这是怎么回事?这是否使它超级DUPER静态? :)

除了开玩笑之外,为什么编译器允许重复静态修饰符?实际上是否有理由允许人们这样做,或者编写编译器的人是否过于懒惰而导致错误?

2 个答案:

答案 0 :(得分:5)

我不是Objective-C开发人员,但该语言是否允许修饰符的任意排序(例如静态volatile extern)?如果是这样,那么编译器中的一个良性错误可能是在读取修饰符后(在这种情况下为“static”)返回到它再次接受任何修饰符终端的状态,并且会一直遇到变量的类型。持续static声明不会与任何先前的修饰符相矛盾,因此不会引起任何错误;基于此,我希望volatile volatile volatile int x;也可以工作。

答案 1 :(得分:2)

对于C 2011,以下适用:

  

第6.7.1节第2段

     

最多可以在声明中的声明说明符中给出一个存储类说明符,但_Thread_local可能与static或extern一起出现。

存储类说明符定义为:

storage-class-specifier:
          typedef 
          extern
          static
          _Thread_local
          auto
          register

因此,对于C 2011,这应该是非法的。


至于目标C,我不知道在哪里可以找到语言规范,所以我无法帮助你。