这是一个函数,用于检查用户输入到我正在编译的解释器/解析器中的函数的名称,并将其与函数数组进行比较,并执行相应的C++函数。只要用户输入正确的函数名称,它就可以正常工作,但如果用户输入的名称没有功能,解释程序就会以一些无法解释的运行时错误结束,即使我将其编程为打印“未定义的函数”,然后继续解析循环:C++解析器源代码中的不明原因错误
void parser::eval_cmd(std::string& exp, pro::command fset[])
{
expr = exp;
exp_ptr = (char*) expr.c_str();
bool found = false;
for (int i = 0; i < (int)sizeof(fset); i++)
{
if (fset[i].check(expr))
{
found = true;
exp_ptr = (char*)expr.c_str() + (fset[i].name.size() - 1);
if (fset[i].cmd)
fset[i].cmd(eval_args());
break;
}
}
if (!found) err::show(err::UNDEFINED);
}
我究竟做错了什么?
由于无法解释的错误,你的意思是'err :: show(err :: UNDEFINED);'已经执行了吗? – Shahbaz
@Shahbaz我之所以称之为“无法解释的”错误的原因是为了让人们明白我不是在谈论自己的错误。 – ApprenticeHacker
expr = exp;这行不是对原始字符串进行深层复制(std :: string实现引用计数)。比你抛弃了底层char *的代价。有很好的理由为什么c_str()返回一个const char *。你不应该以这种方式使用std :: string。 –