static char关键字在函数数组参数中的用途如"char s [static 10]"?

dre*_*lax 131 c arrays parameters static

在浏览一些源代码时,我遇到了这样的函数:

void someFunction(char someArray[static 100])
{
    // do something cool here
}
Run Code Online (Sandbox Code Playgroud)

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

void someFunction(char someArray[const])
{
    // do something cool here
}
Run Code Online (Sandbox Code Playgroud)

似乎只有[ ]在将数组声明为函数的参数时才允许使用限定符.这些怎么办?为什么功能参数不同?

Nor*_*ame 116

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

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

第二个声明只是声明someArray(不是someArray's的元素!)为const,即你不能写someArray=someOtherArray.它与参数相同char * const someArray.

此语法仅[]在函数参数列表中的数组声明符的最内层中可用,在其他上下文中没有意义.

涵盖上述两种情况的标准案文载于C11 6.7.6.3/7(C99为6.7.5.3/7):

一个参数为""类型的阵列""的声明,应调整至""合格指针为类型"",其中类型限定符(如果有的话)的那些内的指定[]该阵列类型的推导.如果关键字static也出现在数组类型派生的[]中,那么对于每次对函数的调用,相应的实际参数的值应提供对数组的第一个元素的访问,其中元素的数量至少与大小表达.

  • 关于这个主题:我想知道是否应该考虑使用`int foo(struct bar [static 1]);`而不是`int foo(struct bar*);`作为不接受NULL指针的函数的签名.(我知道gcc有一个替代的非标准语法来标记这些函数,以便编译器可以发出警告..) (32认同)
  • @NordicMainframe:已经有一段时间了,但是当你试图将一个已知的NULL参数传递给一个带有`[static 1]`参数声明的函数时,当前版本的`clang`会正确地发出警告. (11认同)
  • 这个链接似乎已经腐烂了,这是它指向的吗?http://pic.dhe.ibm.com/infocenter/zos/v1r12/index.jsp?topic=%2Fcom.ibm.zos.r12.cbclx01%2Fparam_decl.htm (5认同)
  • 我刚刚检查了gcc和clang,并且当我要求它们与0进行比较时,并没有假设someArray总是非null.而且我很难在C99中找到确定它的确切子句.在6.7.5.3-21中有一个注释,其中提到了预期的含义,就是这样.我怀疑我们可以依靠这个.此外,所有这些都不是函数签名的一部分,因此我们通过它执行的内容并不多. (2认同)
  • @CiroSantilli 巴拿马文件六四事件法轮`if (!someArray) { somecode... }` 可以被删除 (2认同)