【问题标题】:Static keyword in function parameter函数参数中的静态关键字
【发布时间】:2011-01-16 22:30:09
【问题描述】:

我刚刚在一些嵌入式代码中找到了这个函数定义:

float round_float_to_4(static float inputval);

我熟悉 static 的其他用途(全局变量、函数和局部变量),但这是我第一次看到它作为函数参数的说明符。我假设这会强制编译器为 inputval 而不是堆栈使用固定内存位置?

【问题讨论】:

  • 在 gcc 中我得到error: storage class specified for parameter x

标签: c static function parameter-passing


【解决方案1】:

按照 C 标准,

应出现在参数中的唯一存储类说明符 声明是注册。

【讨论】:

    【解决方案2】:

    许多嵌入式设备的堆栈严重受限,这样的功能将非常有利于减少堆栈溢出的机会,同时仍然为您提供可重入代码的机会。

    较小的芯片没有任何机会将变量放入堆栈,因此所有参数都是隐式内存位置。

    【讨论】:

      【解决方案3】:

      这是无效的。 static 可以在我知道的函数参数中使用的唯一有效位置是在数组维度中

      float round_float_to_4(float inputval[static 4]);
      

      inputval 将在对该函数的所有调用中指向至少提供4 浮点数的内存(这是C99 的补充,它不会出现在C89 中)。

      【讨论】:

      • @KennyTM,是的,这意味着参数声明等同于int * const y:所以它改变了顶级资格。然而,4 没有static,这次没有真正的意义。
      【解决方案4】:

      这是非标准的。我猜想和你一样,我对具有嵌入式目标的编译器中的这种扩展并不感到惊讶。

      【讨论】:

      • 你是对的。我检查了编译器(Microchip C18)的手册,发现:“函数参数可以有存储类自动或静态。自动参数放置在软件堆栈上,可以重入。静态参数是全局分配的,可以直接访问通常较小的代码。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      相关资源
      最近更新 更多