我现在很确定我的 IDE 搞砸了,它没有始终如一地报告警告,所以我认为第一 block 代码可能没有问题。但是我不确定;如果有帮助,我会使用 Eclipse Juno for C/C++ Developers 和 Mingw setup。
我一直在从 Stroustrup 的优秀书籍编程 - 使用 C++ 的原则和实践中学习 C++。我已经设法通过这个网站和其他网站解决了我的大部分问题,但没有问,但这个问题让我避而不谈:为什么我收到警告“控制到达非无效函数的结尾 [-Wreturn-type]”?
Token get_token(){ // read a token from cin
char ch;
cin >> ch; // note that >> skips whitespace (space, newline, tab, etc.)
switch (ch) {
//not yet case ';': // for "print"
//not yet case 'q': // for "quit"
case '(': case ')': case '+': case '-': case '*': case '/':
return Token(ch); // let each character represent itself
case '.':
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
cin.putback(ch); // put digit back into the input stream
double val;
cin >> val; // read a floating-point number
return Token('8',val); // let '8' represent "a number"
}
default:
{error("Bad token");
return 1;}
}
}
其中有两个警告和三个“没有返回,函数返回非空”。这是怎么回事?后者的一个例子:
double term(){
double left = primary();
Token t = get_token(); // get the next token
while(true) {
switch (t.kind) {
case '*':
left *= primary();
t = get_token();
break;
case '/':
{
double d = primary();
if (d == 0) error("divide by zero");
left /= d;
t = get_token();
break;
}
default:
return left;
}
}
}
整个代码可以下载here .
最佳答案
从逻辑上讲,无法到达每个函数的末尾,因为在第一种情况下,您使用默认值 switch(),在每个分支中返回,而在第二种情况下,有一个无限循环,其中没有任何 break 语句。但是,您依赖编译器来解决这个问题(例如通过流分析)。如果它不能那么它会提示你可以在不返回的情况下到达函数的末尾。
我在惠普的编译器上看到过这个,它似乎没有做太多的流分析。 gcc 4.8 不会提示你的这个。但是,如果您想要 (a) 可移植和 (b) 无警告,那么仅添加 return 语句可能会导致当前静默的编译器中出现“无法访问的代码”警告。在我的公司内,我们通过说 RETURN_IF_NO_FLOW_ANALYSIS (0) 来解决这个问题,其中 RETURN_IF_NO_FLOW_ANALYSIS(x) 是一个在 MSVC、gcc 等上计算为空的宏,并且“返回 x;”例如惠普的编译器。这让我们没有警告 - 我们编译时将警告作为错误。虽然不是特别漂亮:如果有人知道更好的解决方法,那么我很感兴趣......
关于c++ - 看不到 "control reaches end of non-void function [-Wreturn-type]"的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22427323/