“char s ”这个函数的数组参数中static关键字的用途是什么?

浏览一些源代码时,我遇到了这样一个函数:

void someFunction(char someArray[static 100]) { // do something cool here } 

通过一些实验,看起来其他限定符也可能出现在那里:

 void someFunction(char someArray[const]) { // do something cool here } 

当数组声明为函数的参数时,似乎限定符只允许在[ ]内。 这些做什么? 为什么function参数不同?

第一个声明告诉编译器someArray 至less有 100个元素。 这可以用于优化。 例如,这也意味着someArray从不为NULL。

请注意,C标准不要求编译器诊断对函数的调用何时不符合这些要求(即,它是静默未定义的行为)。

第二个声明只是声明someArray (不是someArray的元素!)为const,即你不能写someArray=someOtherArray 。 就像参数是char * const someArray

这个语法只能在函数参数列表的数组声明符的最里面的[]中使用,在其他上下文中是没有意义的。

包含上述两种情况的标准案文见C11 6.7.6.3/7(C99中为6.7.5.3/7):

参数声明为''数组types''应该被调整为''限定types指针',其中types限定符(如果有)是在数组types派生的[]中指定的。 如果关键字static也出现在数组types派生的[]中,那么对于函数的每次调用,相应实际参数的值将提供对数组的第一个元素的访问,至less与指定的元素一样多由大小expression。