Answers:
第一个声明告诉编译器someArray
是至少 100个元素长。这可以用于优化。例如,这也意味着someArray
永不NULL
。
请注意,C标准不要求编译器诊断对函数的调用何时不满足这些要求(即,它是静默的未定义行为)。
第二个声明只是声明someArray
(不是someArray
元素!)为const,即您不能编写someArray=someOtherArray
。与参数相同char * const someArray
。
此语法仅[]
在函数参数列表中的数组声明符的最内部可用。在其他情况下,这是没有意义的。
在C11 6.7.6.3/7中涵盖了以上两种情况的标准文本(在C99中为6.7.5.3/7):
参数声明为“类型数组”应调整为“类型的合格指针”,其中类型限定符(如果有的话)是在
[
和]
数组类型派生中指定的类型限定符。如果关键字static也出现在[
和]
的数组类型推导中,则对于函数的每次调用,相应的实际参数的值应提供对数组第一个元素的访问,该元素的数量至少与大小表达式。
clang
当您尝试使用[static 1]
参数声明将已知NULL参数传递给函数时,现在的当前版本会正确警告。
if (!someArray) { somecode... }
可以删除
int foo(struct bar [static 1]);
而不是int foo(struct bar *);
作为不接受NULL指针的函数的签名。(我知道gcc具有替代的非标准语法来标记此类功能,以便编译器可以发出警告。)