Есть ли способ объявить статическую переменную внутри функции и инициализировать ее значением, аналогичным приведенному выше примеру?
Я вижу еще одну проблему и предлагаю идею, которая решает обе проблемы.
Переполнение в вычитании
if (previous_input - current_input > SOME_THRESHLD) // OF possible
Учитывая, что previous_input, current_input
может независимо быть любым из 2 32 , разница составляет около 2 33 разные результаты.С int
как 32-битным, код может переполниться (UB) и не может различить это однозначно.На исключительных платформах с 64-битной int
разница хорошо рассчитана, но теперь функциональность отличается от 32-битной платформы.
Рассмотрите возможность использования int64_t
, так как требуется 33+ битная математика.
#define SPECIAL_BIG (INT64_MAX/2)
static int64_t previous_input = SPECIAL_BIG;
if (previous_input == SPECIAL_BIG) {
previous_input = read_encoder(); // first time
}
...
if (previous_input - current_input > SOME_THRESHLD) {
some_action();
}
}
...
if (previous_input - current_input > SOME_THRESHLD) // OF not possible
С другой стороны, если не все 2 32 комбинации возможны и вычитание и сравнение хорошо вписываются в 32-битную математику, тогда используйте зарезервированное значение. @ user3386109 и просто определить, что нужно выполнить для инициализации.
static int32_t previous_input = SPECIAL.
if (previous_input == SPECIAL) {
previous_input = read_encoder(); // first time
}
Мне нравится идея отдельного флага static
, предложенного другими.Но хотел предложить другой подход.
IAC, код, в общем, нуждается в защите с previous_input - current_input