如何使用静态变量记住上一个传递的参数

时间:2019-04-16 20:41:54

标签: c++ c

我有一个接收参数并执行某些操作的函数。我想检查参数是否不同于对函数的最后一次调用。据我了解,我可以轻松地使用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();
    }    
} 

2 个答案:

答案 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;
}