在浏览一些源代码时,我遇到了这样的函数:
void someFunction(char someArray[static 100]) { // do something cool here }
通过一些实验,似乎其他限定符也可能出现在那里:
void someFunction(char someArray[const]) { // do something cool here }
似乎只有[ ]在数组被声明为函数的参数时才允许在内部使用限定符。这些有什么作用?为什么函数参数不同?
[
]
第一个声明告诉编译器someArray至少 有 100 个元素长。这可以用于优化。例如,它也意味着someArray从不NULL。
someArray
NULL
请注意,C 标准不要求编译器在对函数的调用不满足这些要求时进行诊断(即,它是无声的未定义行为)。
第二个声明只是将someArray(不是someArray‘s 元素!)声明为 const,即,你不能写someArray=someOtherArray. 就好像参数是一样char * const someArray。
someArray=someOtherArray
char * const someArray
[]这种语法只能在函数参数列表中数组声明符的最里面使用;这在其他情况下没有意义。
[]
涵盖上述两种情况的标准文本位于 C11 6.7.6.3/7 中(在 C99 中为 6.7.5.3/7):
将参数声明为“类型的数组”应调整为“类型的限定指针”,其中类型限定符(如果有)是在[和]中指定的那些数组类型推导。如果关键字 static 也出现在数组类型派生的[and]中,则对于函数的每次调用,对应的实际参数的值应提供对数组的第一个元素的访问,该数组的元素至少与尺寸表达。