函数的数组参数中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…}
可以删除