CppUnit:为什么静态局部变量保持其值?

804*_*142 -1 c++ oop static cppunit initialization

我正在尝试使用CppUnit来测试一个只在第一次调用时才执行某些代码的方法.

class CElementParseInputTests: public CppUnit::TestFixture {
private:
    CElement* element;
public:

    void setUp() {
        element = new CElement();
    }

    void tearDown() {
        delete element;
    }

    void test1() {
        unsigned int parsePosition = 0;
        CPPUNIT_ASSERT_EQUAL(false, element->parseInput("fäil", parsePosition));
    }

    void test2() {
        unsigned int parsePosition = 0;
        CPPUNIT_ASSERT_EQUAL(false, element->parseInput("pass", parsePosition));
    }
Run Code Online (Sandbox Code Playgroud)

我想测试的递归方法:

bool CElement::parseInput(const std::string& input, unsigned int& parsePosition) {
    static bool checkedForNonASCII = false;
    if(!checkedForNonASCII) {
        std::cout << "this should be printed once for every test case" << std::endl;
        [...]
        checkedForNonASCII = true;
    }
    [...]
    parseInput(input, parsePosition+1)
    [...]
}
Run Code Online (Sandbox Code Playgroud)

由于对象是为每个测试用例重新创建然后销毁的,我希望在运行测试时,字符串"这应该为每个测试用例打印一次"将打印两次,但它只打印一次.我错过了什么?

son*_*yao 5

这就是静态局部变量应该做的事情.

在块作用域中使用指定符static声明的变量具有静态存储持续时间,但在控件第一次通过其声明时初始化(除非它们的初始化为零或常量初始化,这可以在首次输入块之前执行).在所有进一步的调用中,将跳过声明.

这意味着第一次通话checkedForNonASCII只会被初始化为false一次.对于进一步的调用,跳过初始化; 即checkedForNonASCII不会false再次初始化.