在浏览一些源代码时,我遇到了这样的函数:
void someFunction(char someArray[static 100])
{
// do something cool here
}
通过一些实验,似乎其他限定符也可能出现在那里:
void someFunction(char someArray[const])
{
// do something cool here
}
当数组被声明为函数的参数时,似乎只允许在[
]
内使用限定符。这些怎么办?为什么函数参数不同?
答案 0 :(得分:112)
第一个声明告诉编译器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):
参数声明为''数组类型''应调整为''限定指向类型'',其中类型限定符(如果有)是
[
和{{ 1}}数组类型派生。如果关键字static也出现在数组类型派生的]
和[
内,那么对于每次对函数的调用,相应的实际参数的值应该提供对数组的第一个元素的访问与至少一样多 由size表达式指定的元素。