Ker*_* SB 29 c arrays c99 function-prototypes c11
显然,以下函数原型在C99和C11中有效:
void foo(int a[const *]);
void bar(int a[static volatile 10]);
Run Code Online (Sandbox Code Playgroud)
什么是那些奇怪的符号下标为目的*
,static
和CV预选赛?
它们有助于区分静态类型数组和可变长度数组吗?或者他们只是语法糖?
oua*_*uah 25
参数数组声明符中的static
void f(int a[static 10]);
Run Code Online (Sandbox Code Playgroud)
static
这是一个指示,参数a
是一个指针,int
但数组objet(其中a
是指向其第一个元素的指针)至少有10
元素.
然后编译器有权假设f
参数不是NULL
,因此它可以执行一些优化.gcc
目前不执行任何优化(来源):
"参数数组声明符中的static提供的信息不用于优化.将来与预取工作结合使用可能是有意义的."
参数数组声明符中的限定符
void g(int a[cvr 10]);
Run Code Online (Sandbox Code Playgroud)
内部g
a
是一个CVR指针int
(CVR是const
,volatile
或restrict
限定符).例如,with const
it表示指向(即,键入)a
的const
指针.int
int * const
所以参数声明:
T param[cvr e]
Run Code Online (Sandbox Code Playgroud)
与参数声明相同:
T * cvr param
Run Code Online (Sandbox Code Playgroud)
* 在参数数组声明符中
void h(int a[*]);
Run Code Online (Sandbox Code Playgroud)
的[*]
在函数声明的正式阵列参数声明(即不是一个函数定义的一部分),表示该正式阵列是可变长度的数组.