我有一个函数,它接收一个参数并做一些事情。我想检查参数是否与上次对函数的调用不同。据我所知,我可以很容易地使用golbal变量或全局静态(仅在当前转换单元中)。但是在函数内部使用静态变量是否有可能实现相同的功能(如果我有许多类似的函数,我认为它更可读,代码也更干净)。
问题是我应该初始化变量,以便下次调用该函数时确保它工作正常?
// Scenario A
void foo(uint16_t stuff) {
// Error: Obviously lastStuff is not declared yet!
if(lastStuff != stuff) {
doStuff();
}
static uint16_t lastStuff = stuff;
}
// Scenario B
void foo(uint16_t stuff) {
static uint16_t lastStuff = stuff;
// lastStuff will always be equal to stuff
if(lastStuff != stuff) {
doStuff();
}
}
最佳答案
您的场景B
几乎是正确的,但是您需要一种方法来查看是否至少执行了一次。您可以使用std::optional
或一个简单的布尔标志来执行此操作-为了简单起见,我将使用该标志:
// Scenario B
void foo(uint16_t stuff) {
static uint16_t lastStuff;
static bool last_inited = false;
// lastStuff will be impossible value on the first execution
if(lastStuff != stuff || !last_inited) {
last_inited = true;
doStuff();
}
lastStuff = stuff;
}
它要做的是在第一次执行函数时将静态bool变量初始化为
false
,然后将其设置为true
,并在接下来的所有执行中保持为true。