VS 2010 C++智能感知 "a storage class may not be specified here"即使它可以?



这是一个很小的问题,但它让我很恼火: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;
    }
}

if ( static bool runonce = true )行中的static以及_MESSAGE_VMESSAGE(使用类似构造)的每次使用都由IntelliSense加下划线,并将鼠标悬停在任何一行上,显示"错误:此处可能未指定存储类"。构建项目不会产生与这些行相关的错误。

VC++编译器允许将其作为静默扩展(这不是合法的C++),但VC++IntelliSense引擎基于EDG编译器前端,而不是VC++编译器(见图)。因此,如果您关心编写可移植代码,那么IntelliSense错误是正确的。

等等——你是说下面的代码在MSVC中编译和运行吗?

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

这对我来说是个新问题。g++当然不接受。

顺便说一句,在你的问题中,你提到了"在函数范围内声明静态变量",这不是问题:

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

相关内容

  • 没有找到相关文章

最新更新