在C99中有变长数组,参数数组声明符中可以有静态限定符(和类型限定符):
void f(int i, int *a);
void f(int i, int a[]);
void f(int i, int a[i]);
void f(int i, int a[*]); // Only allowed in function prototypes.
void f(int i, int a[static i]);
由于数组函数参数只是衰减到指针,以前的声明之间是否存在实际差异,还是风格问题?什么时候应该使用它们?特别是static
限定符意味着什么?该标准没有清楚地说明每种语法的原因。
答案 0 :(得分:24)
只要您只使用一维数组,上述声明都是等效的。最后一个虽然
void f(int i, int a[static i])
有额外的效果。它在参数类型方面等同于以前的参数类型,但也告诉编译器它可以依赖指向至少a
元素的数组的i
参数(可以在优化中使用) )。
您还忘记了另一个新声明
void f(int i, int a[const])
即使在一维数组的情况下,这个实际上确实有效。它相当于
void f(int i, int *const a)
虽然有些人可能认为对函数参数的const限定是无用的。在使用[]
语法进行声明时,无法对指针进行const限定之前,数组参数会“衰减”。
*
之间的i
(以及[]
)仅在多个[]
中的[]
对之间使用时才开始重要 - 维数组声明。本质上,它就像它一直一样:参数声明中的数组大小始终只在第二对或另一对*
之间起作用。当未明确命名大小值时,void bar(int n, int m, int a[n][m]);
用于VLA参数的原型声明。例如,您可以声明
a
并且编译器将知道a
是VLA,因为大小不是常量。但是如果您不想在原型中命名参数,那么您如何告诉编译器*
是VLA?那是void bar(int, int, int a[*][*]);
帮助
{{1}}