考虑以下函数
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/