显然,以下函数原型在 C99 和 C11 中有效:
void foo(int a[const *]);
void bar(int a[static volatile 10]);
那些奇怪的下标符号 , 和 CV 限定符的目的是*
什么static
?
它们是否有助于区分静态类型数组和可变长度数组?还是它们只是语法糖?
显然,以下函数原型在 C99 和 C11 中有效:
void foo(int a[const *]);
void bar(int a[static volatile 10]);
那些奇怪的下标符号 , 和 CV 限定符的目的是*
什么static
?
它们是否有助于区分静态类型数组和可变长度数组?还是它们只是语法糖?
参数数组声明器中的静态
void f(int a[static 10]);
static
这表明参数a
是一个指针,int
但数组对象(其中a
是指向其第一个元素的指针)至少具有10
元素。
然后编译器有权假设f
参数不是NULL
,因此它可以执行一些优化。gcc
当前不执行优化(source):
“参数数组声明器中静态提供的信息不用于优化。将来与预取工作结合使用它可能是有意义的。”
参数数组声明器中的限定符
void g(int a[cvr 10]);
insideg
a
是指向(cvr is或限定符)的cvr指针。例如,它的意思是指向(即 type )的指针。int
const
volatile
restrict
const
a
const
int
int * const
所以一个参数声明:
T param[cvr e]
与参数声明相同:
T * cvr param
* 在参数数组声明器中
void h(int a[*]);
[*]
函数声明(不是函数定义的一部分)中的形式数组参数声明表示形式数组是可变长度数组。