C99中那些奇怪的数组大小[*]和[静态]是什么?

时间:2013-07-09 22:52:22

标签: c arrays c99 function-prototypes c11

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

void foo(int a[const *]);

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

这些奇怪的下标符号*static和CV限定符的用途是什么?

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

1 个答案:

答案 0 :(得分:21)

参数数组声明符中的

static

 void f(int a[static 10]);

static这里表明参数a是指向int的指针,但是数组objet(其中a是指向其第一个元素的指针)具有最少10个元素。

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

  

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

参数数组声明符中的

限定符

void g(int a[cvr 10]);
<{1}} g内的 cvr 是指向a的指针( cvr int,{{1 }或const限定符)。例如,使用volatile表示restrict是指向const的{​​{1}}指针(即类型a)。

参数声明:

const

与参数声明相同:

int
参数数组声明符中的

*

int * const

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