【问题标题】:What are those strange array sizes [*] and [static] in C99?C99 中那些奇怪的数组大小 [*] 和 [static] 是什么?
【发布时间】: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


【解决方案1】:

参数数组声明器中的静态

 void f(int a[static 10]);

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

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

“参数数组声明器中静态提供的信息不用于优化。将来结合预取工作使用它可能有意义。”

参数数组声明符中的限定符

void g(int a[cvr 10]);

ga 内部是一个指向intcvr 指针(cvrconstvolatilerestrict 限定符)。例如,const 表示a 是一个指向constconst 指针(即,键入int * const)。

所以一个参数声明:

T param[cvr e] 

和参数声明一样:

T * cvr param

* 在参数数组声明符中

void h(int a[*]);

函数声明(不是函数定义的一部分)的形式数组参数声明中的[*] 表示形式数组是可变长度数组。

【讨论】:

  • 这有什么用?当我使用错误类型的数组(错误的大小或错误的 VLAness)调用函数时,我似乎没有得到 任何 有意义的诊断。你得到sizeof[*] 的支持吗?
  • @KerrekSB C 不需要诊断,我猜编译器不会发出警告,因为这个功能很少使用。
  • @KerrekSB for sizeofint (*)[*] 例如 gcc 我得到 '[*]' 不允许在函数原型范围内
  • @KerrekSB, sizeof for the [*] 是不可能的,原因很简单,这是允许在声明中而不是在定义中。对于作为函数参数的 VLA,大小表达式的求值就像它位于函数体的开头一样。 [*] 是声明中表达式的占位符,用于那些不知道(或不想)使该表达式在界面中可见的情况。在函数sizeof 内部按预期工作,只是你没有第一个维度,就像数组参数一样。
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多