显然,以下函数原型在C99和C11中有效:
void foo(int a[const *]);
void bar(int a[static volatile 10]);
这些奇怪的下标符号*
,static
和CV限定符的用途是什么?
它们是否有助于区分静态类型数组和可变长度数组?或者他们只是语法糖?
答案 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]
(不是函数定义的一部分)表示正式数组是可变长度数组。