函数的数组参数中static关键字的用途是什么;字符s[静态10]“是什么?”;?

函数的数组参数中static关键字的用途是什么;字符s[静态10]“是什么?”;?,c,arrays,parameters,static,C,Arrays,Parameters,Static,在浏览一些源代码时,我遇到了如下函数: void someFunction(char someArray[static 100]) { // do something cool here } 通过一些实验,似乎也会出现其他限定符: void someFunction(char someArray[const]) { // do something cool here } 似乎只有当数组声明为函数的参数时,才允许在[]中使用限定符。这些是干什么用的?为什么函数参数不同?第一个声

在浏览一些源代码时,我遇到了如下函数:

void someFunction(char someArray[static 100])
{
    // do something cool here
}
通过一些实验,似乎也会出现其他限定符:

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

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

第一个声明告诉编译器
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也出现在数组类型派生的
[
]
中,则对于函数的每次调用,对应的实际参数的值应提供对数组的第一个元素的访问,该元素的数量至少与 由大小表达式指定的元素


关于这个主题:我想知道是否应该考虑使用
intfoo(structbar[static1])而不是
intfoo(结构条*)
作为不接受空指针的函数的签名。(我知道gcc有一个替代的非标准语法来标记这样的函数,这样编译器就可以发出警告了。)我刚刚检查了gcc和clang,当我要求它们与0进行比较时,它们都没有假设someArray总是非空的。我还努力在C99中找到定义它的确切子句。6.7.5.3-21中有一个注释提到了预期的含义,就是它。我怀疑我们能否依赖这一点。此外,所有这些都不是函数签名的一部分,因此我们通过它执行的内容不多。这个链接似乎已经腐烂了,这就是它所指的吗@NordicMainframe:已经有一段时间了,但是当前版本的
clang
现在可以正确地警告您,当您试图将已知的空参数传递给带有
[static 1]
参数声明的函数时。@CiroSantilli巴拿馬文件六四事件法轮功
如果(!someArray){somecode…}
可以删除