VS 2010 C ++ IntelliSense "класс хранилища здесь не может быть указан", хотя может? - PullRequest
3 голосов
/ 01 июня 2011

Это довольно незначительный вопрос, но он меня раздражает: IntelliSense, похоже, убежден, что объявление статических переменных в области действия функции в состоянии if является ошибкой, и жалуется на это. Только он прекрасно работает, и даже документы MSDN упоминают его как законное использование. Мне бы очень хотелось избавиться от волнистой красной линии, потому что она встречается довольно часто (она используется в макросе, которым я регулярно пользуюсь).

Вот пример кода, хотя это не единственный пример в моей программе:

MyForm::MyForm()
{
    _VMESSAGE("Constructing '%s'/%p:%p @ <%p>",GetEditorID(),GetFormType(),formID,this);
    if (static bool runonce = true)
    {
        // patch up vtbl    
        memaddr thisvtbl = (UInt32)memaddr::GetObjectVtbl(this);
        _MESSAGE("Patching MyForm Form vtbl @ <%p>",thisvtbl);
        gLog.Indent();
        for (int i = 0; i < sizeof(Form_NoUseMethods)*0x8; i++)
        {
            if ((Form_NoUseMethods[i/0x20] >> (i%0x20)) & 1)
            {
                thisvtbl.SetVtblEntry(i*4,TESForm_vtbl.GetVtblEntry(i*4));
                _VMESSAGE("Patched Offset 0x%04X",i*4);
            }
        }
        gLog.Outdent();

        runonce  =  false;
    }
}

Как static в строке if ( static bool runonce = true ), так и каждое использование _MESSAGE или _VMESSAGE (в котором используется аналогичная конструкция) подчеркивается IntelliSense, и при наведении курсора на любое чтение "Ошибка: класс хранения может не быть уточненным здесь. Построение проекта не дает ошибок, связанных с этими строками.

Ответы [ 2 ]

6 голосов
/ 01 июня 2011

Компилятор VC ++ допускает это как тихое расширение (это недопустимо в C ++), но механизм IntelliSense VC ++ основан на интерфейсе компилятора EDG *1002*, а не на компиляторе VC ++ (см. Рисунок).Итак, ошибка IntelliSense верна, если вы беспокоитесь о написании переносимого кода.

0 голосов
/ 01 июня 2011

Держись - ты говоришь, что следующий код компилируется и работает в MSVC?

int main() {
  if (static bool runonce = true) return 0 ;
}

Это новый для меня. g ++ конечно не принимает .

Кстати, в своем вопросе вы упоминаете «объявление статических переменных в области действия функции», что не является проблемой:

int main() {
  static bool runonce = true ;
  if (runonce) return 0 ;
}
...