在c程序中的数字前面的静态

时间:2015-07-31 14:30:27

标签: c static

所以我正在阅读一篇关于优化int块的排序的博客,其实现在c中。我走过这条线,我不明白:

void nibble_sort_bucket(uint64_t buf[static 1024]) {

缓冲区基本上是要排序的数据,并且其中的每个int都得到4位排序的块,所以它基本上用于基准测试。 当我在c中查找静态的使用时,我发现了两件事。

  1. 将函数定义保密为文件。
  2. 在函数调用之间保持变量值。
  3. 这些都没有意义。有人可以解释为什么你会在一个数字前写静态,这会做什么?

2 个答案:

答案 0 :(得分: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 :(得分:1)

此语句buf[static 1024]告诉编译器 buf 至少为1024个字符。它用于优化,换句话说,它想说 buf 永远不会为空。