我只是在Xcode中鬼混,我发现以下语句编译并且它甚至没有发出警告,更不用说错误了:
static static static int static long static var[5];
这是怎么回事?这是否使它超级DUPER静态? :)
除了开玩笑之外,为什么编译器允许重复静态修饰符?实际上是否有理由允许人们这样做,或者编写编译器的人是否过于懒惰而导致错误?
答案 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,我不知道在哪里可以找到语言规范,所以我无法帮助你。