“ char s [ static 10]”函数的数组参数中的 static 关键字的作用是什么?

在浏览一些源代码时,我偶然发现了一个类似下面这样的函数:

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

通过一些实验,似乎其他限定词也可能出现在这里:

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

似乎只有当数组声明为函数的参数时,才允许在 [ ]中使用限定符。这些是干什么的?为什么函数参数不同?

24541 次浏览

第一个声明告诉编译器 someArray至少100个元素的长度。这可以用于优化。例如,它还意味着 someArray永远不会是 NULL

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

第二个声明只是声明 someArray(而不是 someArray的元素!)作为 const,也就是说,你不能写 someArray=someOtherArray。这与参数是 char * const someArray是相同的。

此语法只能在函数参数列表中的数组声明程序的最内层 []中使用; 在其他上下文中没有意义。

涵盖上述两种情况的标准文本是 C116.7.6.3/7(在 C99中是6.7.5.3/7) :

将参数声明为“ array of type”应调整为“修饰指针到 type”,其中类型修饰符(如果有的话)是在数组类型派生的 []中指定的。如果关键字 static 也出现在数组类型派生的 []中,那么对于对函数的每次调用,相应的实际参数的值应该提供对数组的第一个元素的访问,至少有同样多的元素 大小表达式指定的元素。