静态成员函数中静态变量的C ++范围

时间:2014-01-02 17:51:57

标签: c++ static

我有一个简单的对象可以进行一些解析。在里面,有一个解析函数,包含一个静态变量,用于限制要打印给用户的错误消息的数量:

struct CMYParsePrimitive {
    static bool Parse(const std::string &s_line)
    {
        // do the parsing

        static bool b_warned = false;
        if(!b_warned) {
            b_warned = true;
            std::cerr << "error: token XYZ is deprecated" << std::endl;
        }
        // print a warning about using this token (only once)

        return true;
    }
};

现在,这些解析原语在类型列表中传递给解析器专门化。还有一些其他接口告诉解析器应该使用哪个解析原语来解析哪些令牌类型。

我的问题是每个应用程序运行时警告应该显示一次。但在我的情况下,它有时会多次显示,似乎是每个解析器实例而不是应用程序实例。

我正在使用Visual Studio 2008,我想这可能是一些错误或偏离标准?有没有人知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

我没注意到该功能也是一个模板。我的错。它在代码中使用不同的参数进行了两次实例化 - 因此警告有时会打印两次。真正的代码看起来更像是这样:

struct CMYParsePrimitive {
    template <class CSink>
    static bool Parse(const std::string &s_line, CSink &sink)
    {
        // do the parsing, results passed down to "sink"

        static bool b_warned = false;
        if(!b_warned) {
            b_warned = true;
            std::cerr << "error: token XYZ is deprecated" << std::endl;
        }
        // print a warning about using this token (only once)

        return true;
    }
};

那么就有例如CMYParsePrimitive::Parse<PreviewParser>::b_warned,可以在PreviewParser使用时打印一次警告,然后CMYParsePrimitive::Parse<Parser>::b_warned可以在Parser使用时打印警告。