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
是一个指向int
的cvr指针( cvr是const
, volatile
或restrict
限定符)。 例如,对于const
它表示a
是一个指向int
的const
指针(即,类型为int * const
)。
所以一个参数声明:
T param[cvr e]
与参数声明相同:
T * cvr param
* 在参数数组声明符中
void h(int a[*]);
函数声明中的正式数组参数声明中的[*]
(不是函数定义的一部分)表示正式数组是可变长度数组。