【发布时间】:2013-07-07 17:35:26
【问题描述】:
显然以下函数原型在 C99 和 C11 中有效:
void foo(int a[const *]);
void bar(int a[static volatile 10]);
那些奇怪的下标符号*、static 和 CV 限定符的目的是什么?
它们是否有助于区分静态类型数组和可变长度数组?还是它们只是语法糖?
【问题讨论】:
标签: c arrays c99 function-prototypes c11
显然以下函数原型在 C99 和 C11 中有效:
void foo(int a[const *]);
void bar(int a[static volatile 10]);
那些奇怪的下标符号*、static 和 CV 限定符的目的是什么?
它们是否有助于区分静态类型数组和可变长度数组?还是它们只是语法糖?
【问题讨论】:
标签: c arrays c99 function-prototypes c11
参数数组声明器中的静态
void f(int a[static 10]);
static 这里表明参数a 是指向int 的指针,但数组对象(其中a 是指向其第一个元素的指针)至少具有10 元素。
然后编译器有权假设f 参数不是NULL,因此它可以执行一些优化。 gcc 当前未执行任何优化 (source):
“参数数组声明器中静态提供的信息不用于优化。将来结合预取工作使用它可能有意义。”
参数数组声明符中的限定符
void g(int a[cvr 10]);
在ga 内部是一个指向int 的cvr 指针(cvr 是const、volatile 或restrict 限定符)。例如,const 表示a 是一个指向const 的const 指针(即,键入int * const)。
所以一个参数声明:
T param[cvr e]
和参数声明一样:
T * cvr param
* 在参数数组声明符中
void h(int a[*]);
函数声明(不是函数定义的一部分)的形式数组参数声明中的[*] 表示形式数组是可变长度数组。
【讨论】:
sizeof 对[*] 的支持吗?
sizeof 和 int (*)[*] 例如 gcc 我得到 '[*]' 不允许在函数原型范围内
sizeof for the [*] 是不可能的,原因很简单,这是仅允许在声明中而不是在定义中。对于作为函数参数的 VLA,大小表达式的求值就像它位于函数体的开头一样。 [*] 是声明中表达式的占位符,用于那些不知道(或不想)使该表达式在界面中可见的情况。在函数sizeof 内部按预期工作,只是你没有第一个维度,就像数组参数一样。