【问题标题】:Function Should Return Value Question函数应该返回值问题
【发布时间】:2011-03-06 08:21:28
【问题描述】:

给定一个这样的函数

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

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

【问题讨论】:

  • 您使用的是什么编译器和平台?
  • C++-builder-5 windows xp
  • 出于好奇,您使用的是什么编译器?我认为您的问题是量子概率。虽然某些东西可能是 X 或不是 X,但您无法处理 X 甚至不是所有存在的所有事物的子集的可能性!
  • 哇,这是过去的一次爆炸。 C++ Builder现在不是已经有10年了吗?如果没有记错的话,它会很麻烦,最好使用更新的编译器。
  • @Changeling:除了这个问题表明它已经坏了......或者至少是错误的。

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


【解决方案1】:

如果您编写 return (code == myCode);,您将节省行数,让编译器满意,并且通常会以更 C++ 风格的方式编写。

【讨论】:

  • 是的,但这并不能回答问题。
  • 我不知道确切的编译器,但为了避免错误,编译器将不得不依靠它的手指来计算每个可能的路径(if 和 if 的 else)是否返回一些东西。在任何返回的条件之外找到一条线似乎更快乐。正如我所说,在没有 if 的情况下重写成一行会使编译器更快乐。
  • 经过两年的 SWE 成熟期,我已经接受了这一点。
【解决方案2】:

这样做会更优雅

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

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

【讨论】:

    【解决方案3】:

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

    您可能可以简单地重构您的代码(可能类似于发布的代码)以具有一个返回点,这将避免对您的编译器的警告。

    【讨论】:

    • 确实如此。 C++ Builder 5 没有详尽地检查这些条件。 (不像 C#,规范本身要求他们会被抓住!)。并且使用 C++ Builder 避免此类警告并不总是那么容易,因为编译器检查的内容取决于编译选项。修复调试版本中的警告,它有时会在发布版本中返回,反之亦然:-(
    • 谢谢布赖恩 - 我最终重构了整个东西,现在好多了
    【解决方案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 );
    

    更干净。

    【讨论】:

    • 啊,但是如果逻辑1没有通过,那么逻辑2就会通过,为什么最后还要加上return语句呢?
    • 好吧,在这种情况下,我想我们大多数人都会同意 nothing 在“if”语句之后发生(因此是 OP 的问题..)
    【解决方案5】:

    主观上我同意发帖者的说法,即您应该将其重构为简洁的 x == y return 语句,但是代码没有任何问题。这是你的编译器。

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        你的代码真的和你刚刚发布的sn-p一样简单吗?

        在 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 级嵌套 if...)如果可能的分支太多,编译器只会发送警告。

        如果您的代码位于 try/except 块内,并且执行路径会通过未初始化您的结果的异常,您也可能会收到警告。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-17
          • 1970-01-01
          • 2014-08-03
          相关资源
          最近更新 更多