假设我正在编写一个解释器,其中一个命令的格式为
define variable
其中变量可能只是一个小写的拉丁字母。
这就是我在做什么。确定命令是一个define命令后,我从字符串创建一个流,比如说"define a"
(iss),然后从中读取命令名,断言它确实是“定义”。
std::istringstream iss(Command);
//read the word "define"
std::string cmdstr;
assert(iss >> cmdstr);
assert(cmdstr == DefineStr);
然后我从流中读取一个字符。阅读应该成功,所以我检查
if(!(iss >> var))
{
errorMsg = "Invalid syntax of define command. Too few arguments\n";
return false;
}
然后我必须检查流中没有更多的非空格字符,所以我检查
//the rest of the line must be empty;
if(iss >> var)
{
errorMsg = "Invalid syntax of define command. Too many arguments\n";
return false;
}
我的测试策略是,流 错误 中有更多字符?我知道我可以使用正则表达式,精神解析器等等来解决这个问题,但我想我希望坚持这种方法。问题是在调试模式(MSVC10.0)中,当我输入define a
时,函数按预期工作,而在发布模式下,函数以某种方式进入if(iss >> var)
并说Invalid syntax of define command. Too many arguments
。我被卡住了,我无法理解什么是错的。
该功能的完整代码如下:
bool Interpreter::ExecuteDefineCommand(const std::string& Command, std::string& errorMsg)
{
std::istringstream iss(Command);
//read the word "define"
std::string cmdstr;
assert(iss >> cmdstr);
assert(cmdstr == DefineStr);
//read the variable name
char var;
if(!(iss >> var))
{
errorMsg = "Invalid syntax of define command. Too few arguments\n";
return false;
}
if(!islower(var))
{
errorMsg = "You may define only lowercase variables\n";
return false;
}
//the rest of the line must be empty;
if(iss >> var)
{
errorMsg = "Invalid syntax of define command. Too many arguments\n";
return false;
}
auto insertRes = variables.insert(std::make_pair(var, 0));
if(!insertRes.second)
{
errorMsg = "The variable ";
errorMsg += var;
errorMsg += " has already been defined!\n";
return false;
}
return true;
}
答案 0 :(得分:0)
问题在于:
std::string cmdstr;
assert(iss >> cmdstr);
assert(cmdstr == DefineStr);
因为运营商>>在assert内部,它只是不会在Release模式下执行!正确的方法是
std::string cmdstr;
iss >> cmdstr;
assert(iss);
assert(cmdstr == DefineStr);