C ++ Область действия статической переменной в статической функции-члене

0

У меня есть простой объект, который выполняет некоторые синтаксические разборки. Внутри есть функция синтаксического анализа, содержащая статическую переменную, которая используется для ограничения количества сообщений об ошибках для печати пользователю:

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

Теперь эти примитивы синтаксического анализа передаются в списке типов для специализации парсера. Существует еще один интерфейс, который сообщает парсеру, какие маркерные типы должны анализироваться с использованием примитивов parse.

Моя проблема заключается в том, что предупреждение должно отображаться до одного раза для запуска приложения. Но в моем случае это иногда отображается несколько раз, кажется, для экземпляра парсера, а не для экземпляра приложения.

Я использую Visual Studio 2008, я думаю, это может быть ошибка или отклонение от стандарта? Кто-нибудь знает, почему это происходит?

  • 0
    Вы используете несколько потоков?
  • 10
    Возможно, показанный класс не является реальным кодом, а реальный класс является шаблоном. Может быть, у вас есть проблема с потоками. Кто знает. Разместите минимальный, но полный пример, пожалуйста.
Показать ещё 7 комментариев
Теги:
static

1 ответ

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню