即时使用未声明的标识符'缓冲区' on memcpy(buffer,& m_Text [index],m_Index - index);并返回atof(缓冲区);和未使用的变量'缓冲区' char缓冲区错误[32] = {0};有没有办法解决这个问题?非常感谢
double GetNumber()
{
SkipWhitespaces();
int index = m_Index;
while (isdigit(m_Text[m_Index])) m_Index++;
if (m_Text[m_Index] == '.') m_Index++;
while (isdigit(m_Text[m_Index])) m_Index++;
if (m_Index - index == 0)
char buffer[32] = { 0 };
memcpy(buffer, &m_Text[index], m_Index - index);
return atof(buffer);
}
答案 0 :(得分:5)
让我们添加一些额外的大括号来演示正在发生的事情
double GetNumber()
{
SkipWhitespaces();
int index = m_Index;
while (isdigit(m_Text[m_Index]))
{ // added brace
m_Index++;
} // added close brace.
if (m_Text[m_Index] == '.')
{ // added brace
m_Index++;
} // added close brace.
while (isdigit(m_Text[m_Index]))
{ // added brace
m_Index++;
} // added close brace.
if (m_Index - index == 0)
{ // added brace
char buffer[32] = { 0 };
} // added close brace.
memcpy(buffer, &m_Text[index], m_Index - index);
return atof(buffer);
}
正如最初所写,if
语句没有正文,所以它将下一行作为正文。由于char buffer[32] = { 0 };
是下一行,它会成为if
的一部分,并在if
退出后立即超出范围,memcpy
尝试时不再存在用它。
我强烈建议在学习的同时始终包括所有大括号。它有助于防止错误。如果你愿意,你可以稍后省略它们,但我总是发现它们比障碍更有帮助。
查看源博客的原始代码,我找到了
if(m_Index - index == 0)
throw ParserException("Number expected but not found!", m_Index);
不是
if (m_Index - index == 0)
添加缺失的行(最好与省略的大括号一起添加),char buffer[32] = { 0 };
将再次位于正确的范围内。