我有一个函数,它接收一个参数并做一些事情。我想检查参数是否与上次对函数的调用不同。据我所知,我可以很容易地使用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。

10-02 01:02