C99中那些奇怪的数组大小和是什么?

显然,以下函数原型在C99和C11中有效:

void foo(int a[const *]); void bar(int a[static volatile 10]); 

那些奇怪的下标符号*static和CV限定符的目的是什么?

它们有助于区分静态类型数组和可变长度数组吗? 或者他们只是语法糖?

参数数组声明符中的static

  void f(int a[static 10]); 

static here表示参数a是指向int的指针,但是数组objet(其中a是指向其第一个元素的指针)至少有10元素。

然后编译器有权假设f参数不是NULL ,因此它可以执行一些优化。 gcc目前不执行任何优化( 来源 ):

“参数数组声明符中的static提供的信息不用于优化。将来与预取工作结合使用可能是有意义的。”

参数数组声明符中的限定符

 void g(int a[cvr 10]); 

inside g a是一个指向intcvr指针( cvrconstvolatilerestrict限定符)。 例如,对于const它表示a是一个指向intconst指针(即,类型为int * const )。

所以一个参数声明:

 T param[cvr e] 

与参数声明相同:

 T * cvr param 

* 在参数数组声明符中

 void h(int a[*]); 

函数声明中的正式数组参数声明中的[*] (不是函数定义的一部分)表示正式数组是可变长度数组。