我有一个接收参数并执行某些操作的函数。我想检查参数是否不同于对函数的最后一次调用。据我了解,我可以轻松地使用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();
}
}
答案 0 :(得分:2)
您的场景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;
}
它将执行的操作是在第一次执行函数时将静态布尔变量初始化为false
,然后将其设置为true
,并在所有下一次执行中保持不变。
答案 1 :(得分:2)
您将需要一个单独的标志变量,以查看该函数是否至少被调用过一次:
void foo(uint16_t stuff) {
static int firstTime = 1;
static uint16_t lastStuff = 0;
// lastStuff will always be equal to stuff
if(!firstTime && (lastStuff != stuff)) {
doStuff();
}
lastSutff = stuff;
firstTime = 0;
}