c - C中函数内部的静态变量初始化

标签 c variables static

考虑以下函数

int16_t read_input(void)
{
   static int32_t previous_input = read_encoder(); // <--Not a compile time constant

   //Read current_input 

   if (previous_input - current_input > SOME_THRESHLD)
       some_action();

   previous_input = current_input;

   //some more code + return statement

}

由于变量没有初始化为编译时常量,我无法在没有错误的情况下声明它。我想将变量作为静态变量保留在函数中有两个原因

1) 该变量未在程序的其他任何地方使用。所以没有必要将其作为全局变量保存

2) 前一个函数需要初始化为当前输入,否则在初始运行期间,当前输入和前一个输入之间的差异可能会非常大,因为编码器连接到当前输入(并且无法判断在哪里可能是编码器值,这取决于用户在关闭它之前旋转了多少)。这将造成其他功能的错误触发。

有没有办法在函数内声明一个静态变量并将其初始化为类似于上面给出的示例的值?

注意:此问题是复杂程序的一部分,我已将其简化以避免复杂化。如果问题中有任何歧义,请告诉我

最佳答案

如果您小心处理额外变量,您可以:

int16_t
read_input(void)
{
    static int32_t previous_input = 0;
    static int first_time = 1;

    if (first_time) {
        first_time = 0;
        previous_input = read_encoder();
    }

    // Read current_input

    if (previous_input - current_input > SOME_THRESHLD)
        some_action();

    previous_input = current_input;
}

更新:

如果current_input 来自read_encoder,这是一个清理过的版本,可以防止第一次重复读取。

另外,最初,我使用了一个额外的标志变量,如果没有没有超出范围的值,这是必需的。但是,我已经包含了第二个版本,它使用单个变量,稍微更快[如果不太安全]:

int16_t
read_input(void)
{
    static int32_t previous_input = 0;
    static int first_time = 0;
    int32_t current_input;

    // Read current_input
    current_input = read_encoder();

    if (first_time) {
        first_time = 0;
        previous_input = current_input;
    }

    if (previous_input - current_input > SOME_THRESHLD)
        some_action();

    previous_input = current_input;
}

#define OUT_OF_BOUNDS   -1

int16_t
read_input2(void)
{
    static int32_t previous_input = OUT_OF_BOUNDS;
    int32_t current_input;

    // Read current_input
    current_input = read_encoder();

    if (previous_input == OUT_OF_BOUNDS)
        previous_input = current_input;

    if (previous_input - current_input > SOME_THRESHLD)
        some_action();

    previous_input = current_input;

    // ...
}

关于c - C中函数内部的静态变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662788/

相关文章:

c - clock_getres 的使用 - 新手 Linux C

c# - 在静态字段中引用自身的类可以被垃圾收集吗?

java - java中不同类中通过静态方法设置和获取静态变量值

java - Java中serialVersionUID是如何序列化的?

c - 新的 C11 标准支持 lambda 吗?

c - BST 插入操作。如果已经存在重复节点,则不要插入节点

c - 无法将变量类型转换为指针类型(例如,将int转换为int *)。我想这是一件坏事,但是为什么不可能呢?

Php 阻塞变量声明(w/psql)

file - Go 有模板语言吗?

php - 常量服务器变量?