4

そのような関数を考えると

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

コンパイラが「関数は値を返す必要がある」と不平を言うのはなぜですか。何かが欠けていない限り、true または false を返すことができないのはなぜでしょうか? myCode の値がランタイムに依存しているため、コンパイラが論理パスに確信が持てないためですか?

4

7 に答える 7

25

記述すればreturn (code == myCode);、行を節約し、コンパイラを満足させ、一般的にはより C++ っぽいスタイルで記述します。

于 2010-06-21T14:12:21.630 に答える
9

すべての分岐に return ステートメントがある場合、VC++ および g++ は警告メッセージを表示しません。あなたのコンパイラ (c++-builder-5) は、すべてのブランチにリターン ポイントがあるかどうかを適切にチェックできないと思います。または、return ステートメントを持たない別の条件がどこかに表示されていません。

おそらくコードを簡単にリファクタリングして (これはおそらく投稿されたコードに似ています)、コンパイラーの警告を回避する 1 つの戻り点を持つことができます。

于 2010-06-21T14:16:21.197 に答える
7

した方がエレガントだろう

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

これにより、コンパイラのメッセージ/警告がなくなる場合があります。

于 2010-06-21T14:12:42.500 に答える
5

主観的には、これをきちんとした x == y return ステートメントにリファクタリングする必要があるというポスターに同意しますが、コードに問題はありません。それはあなたのコンパイラです。

于 2010-06-21T14:17:22.613 に答える
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 );

よりきれいです。

于 2010-06-21T14:16:34.460 に答える
1

The following will also likely clear the compiler message/warning.

bool RequestStatus()
{ 
   ...

   if (code == myCode) 
      return true;

   return false;
}
于 2010-06-21T14:59:04.313 に答える
0

あなたのコードは、投稿したスニペットと同じくらい単純ですか?

Delphi (Borland/CodeGear/Embarcadero 製品でもあります) では、実際にはネストされた ifs-hell である wtf コードの一部で同じ「問題」に遭遇しました。

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...

(ネストされた if のレベルは実際には 5 レベルありました...) 分岐の可能性が多すぎる場合、コンパイラは単純に警告を送信しました。

try/exceptコードがブロック内にあり、結果を初期化しない例外を通過する実行パスがある場合にも、警告が表示されることがあります。

于 2010-06-21T15:00:57.750 に答える