功能应该回归价值问题

时间:2010-06-21 14:10:39

标签: c++ return-value c++builder-5

给出类似的功能

bool RequestStatus()
{
    ...
    if (code == myCode) {
         return true;
    } else {
         return false;
    }
}

为什么编译器会抱怨“函数应该返回值”。除非我遗漏了什么,否则它怎么能不归还真或假?是因为myCode的值是运行时相关的,所以编译器在逻辑路径上不确定吗?

7 个答案:

答案 0 :(得分:25)

如果您编写return (code == myCode);,您将保存行,使编译器满意,并且通常使用更多C ++ - ish样式编写。

答案 1 :(得分:9)

如果所有分支都有return语句,VC ++和g ++将不会发出警告消息。我猜你的编译器(c ++ - builder-5)无法正确检查以确定所有分支上是否有返回点。或者在某个地方存在另一个条件,即您没有向我们展示没有返回语句。

您可以轻松地重构代码(可能与发布的代码类似),以便有一个返回点,这将避免编译器发出警告。

答案 2 :(得分:7)

做起来会更优雅

bool RequestStatus()
{
    return code == myCode;
}

这可能会消除您的编译器消息/警告。

答案 3 :(得分:5)

主观上我同意海报说你应该将它重构为一个简洁的x == y return语句,但是代码没有任何问题。这是你的编译器。

答案 4 :(得分:4)

我认为这是编译器的不安。您处于嵌套范围内,编译器可能正在检查函数范围内的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 );

更清洁。

答案 5 :(得分:1)

以下内容也可能会清除编译器消息/警告。

bool RequestStatus()
{ 
   ...

   if (code == myCode) 
      return true;

   return false;
}

答案 6 :(得分:0)

您的代码是否真的像您刚刚发布的代码段一样简单?

在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块内,并且有一条执行路径通过异常但未初始化您的结果,您也可以收到警告。

相关问题