给定这样的功能
bool RequestStatus()
{
...
if (code == myCode) {
return true;
} else {
return false;
}
}
为什么编译器会抱怨“函数应该返回值”。除非我遗漏了什么,否则它怎么可能不返回真假?是因为 myCode 的值依赖于运行时,所以编译器不确定逻辑路径吗?
给定这样的功能
bool RequestStatus()
{
...
if (code == myCode) {
return true;
} else {
return false;
}
}
为什么编译器会抱怨“函数应该返回值”。除非我遗漏了什么,否则它怎么可能不返回真假?是因为 myCode 的值依赖于运行时,所以编译器不确定逻辑路径吗?
如果您编写return (code == myCode);
,您将节省行数,让编译器满意,并且通常会以更 C++ 风格的方式编写。
如果所有分支都有返回语句,则 VC++ 和 g++ 不会给出警告消息。我猜您的编译器(c++-builder-5)无法正确检查以确定所有分支上是否有返回点。或者在某处您没有向我们展示没有返回语句的另一种情况。
您可能可以简单地重构您的代码(这可能类似于发布的代码)以具有一个返回点,这将避免对您的编译器发出警告。
这样做会更优雅
bool RequestStatus()
{
return code == myCode;
}
这可能会消除您的编译器消息/警告。
主观上我同意海报说你应该把它重构为一个整洁的 x == y return 语句,但是代码没有任何问题。这是你的编译器。
我想这是编译器的疑虑。您处于嵌套范围内,编译器可能正在检查函数范围内的 return 语句。
在您的示例中:
bool RequestStatus()
{
...
if (code == myCode) {
return true;
} else {
return false;
}
}
声明后会发生什么if
?您需要在函数末尾添加一个 return 语句,以便覆盖所有执行路径。您可以像这样重构代码:
bool RequestStatus()
{
...
if (code == myCode) {
return true;
}
// else
return false;
}
甚至
return (code == myCode) ? true : false;
但另一个建议
return ( code == myCode );
更干净。
以下内容也可能会清除编译器消息/警告。
bool RequestStatus()
{
...
if (code == myCode)
return true;
return false;
}
您的代码真的和您刚刚发布的代码段一样简单吗?
在 Delphi(也是 Borland/CodeGear/Embarcadero 产品)中,我在一段 wtf 代码上遇到了相同的“问题”,实际上是一个嵌套的 ifs-hell :
if test1 then
if test2 then
if test3 then
if test4 then
if test5
then ...
else ...
else
if test5
then ...
else ...
else
if test4 then
if test5
then ...
else ...
else
if test5
then ...
else ...
//etc...
(实际上有 5 级嵌套 ifs...)如果可能的分支太多,编译器会简单地发送警告。
如果您的代码在一个try/except
块内,并且执行路径通过一个不会初始化您的结果的异常,您也可能会收到警告。