这是一个相当小的问题,但它让我烦恼: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(静态bool runonce = true)行中的静态和_MESSAGE或_VMESSAGE(使用类似构造)的每个用法都由IntelliSense加下划线,并将鼠标悬停在任何读取上“错误:此处可能未指定存储类. “构建项目不会产生与这些线路相关的错误.
解决方法:
VC编译器允许将其作为静默扩展(它不是合法的C),但VC IntelliSense引擎基于EDG compiler frontend,而不是VC编译器(如图).因此,如果您担心编写可移植代码,则IntelliSense错误是正确的.