在C程序中,数字前面的static是什么意思?

8

我正在阅读一篇关于优化整数块排序的博客,实现是用C语言编写的。我遇到了一行代码,不太理解:

void nibble_sort_bucket(uint64_t buf[static 1024]) {

缓冲区基本上是要排序的数据,其中每个int都会被分块为4位进行排序,因此它基本上是用于基准测试。

当我查找C语言中static关键字的用法时,我发现有两种情况:

  1. 将函数定义保持在文件内部不公开。
  2. 在函数调用之间保持变量值。

这两种情况都与此处无关。有人能解释一下你为什么要在数字前面写static,并且那样做的作用是什么吗?


1
在这里,您可以找到您正在寻找的答案: https://dev59.com/YHA75IYBdhLWcg3wMl4Z - Mikser
1
如果'static'再被过度使用,这门语言就会爆炸:( - Martin James
2个回答

9
这是关于static关键字的第三种含义,它在C99中引入,但并不是众所周知的功能。它的目的是告诉编译器你正在传递至少包含1024个元素的数组。
从C99(N1256)§6.7.5.3/p7 函数声明符(包括原型)(我强调):

如果static关键字也出现在数组类型派生的[]之内,则应对每次调用该函数,相应实际参数的值必须提供对至少具有指定大小表达式中所指定元素数量的数组的第一个元素的访问权

实际实现之间存在一些差异。例如,当传递的数组不满足上述子句时,clang会抛出警告。例如:
#include <stdio.h>

void foo(int a[static 10]) {}

int main()
{
    int array[8] = {0};

    foo(array);
}

提示:数组参数太小,只包含8个元素,调用者需要至少10个[-Warray-bounds]

gcc的实现没有任何作用(有关更多信息,请参见GCC bug 50584 )。


1
这个语句 buf[static 1024] 告诉编译器 buf 至少有 1024 个字符长度。它用于优化,换句话说,它想表达的是 buf 永远不可能为 null。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接