【问题标题】:static in front of number in a c program [duplicate]c程序中数字前面的静态[重复]
【发布时间】:2015-07-31 14:30:27
【问题描述】:

所以我正在阅读一篇关于优化 int 块排序的博客,并且实现是在 c 中。我遇到了我不明白的这条线:

void nibble_sort_bucket(uint64_t buf[static 1024]) {

缓冲区基本上是要排序的数据,其中的每个 int 都会对其 4 位的块进行排序,因此它基本上是用于基准测试的。 当我在 c 中查找 static 的用法时,我发现了两件事。

  1. 保持函数定义对文件私有。
  2. 在函数调用之间保留变量值。

这些在这里都没有意义。有人能解释一下为什么你会在数字前面写 static 吗?

【问题讨论】:

标签: c static


【解决方案1】:

这是 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)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-18
      • 2018-05-02
      • 1970-01-01
      • 2013-12-23
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多