Функция должна возвращать значение Вопрос - PullRequest
4 голосов
/ 21 июня 2010

Учитывая функцию, подобную этой

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

Почему компилятор будет жаловаться, что «Функция должна возвращать значение».Если я что-то не упустил, как иначе он не может вернуть истину или ложь?Это потому, что значение myCode зависит от времени выполнения, поэтому компилятор не уверен в логических путях?

Ответы [ 7 ]

25 голосов
/ 21 июня 2010

если вы напишите return (code == myCode);, вы сохраните строки, порадуете компилятор и, как правило, будете писать в стиле C ++.

9 голосов
/ 21 июня 2010

VC ++ и g ++ не будут выдавать предупреждающее сообщение, если все ветви имеют оператор возврата.Я полагаю, ваш компилятор (c ++ - builder-5) не может правильно проверить, есть ли точка возврата во всех ветвях.Или есть другое условие, что вы не показываете нам, у которого нет оператора возврата.

Вероятно, вы можете просто рефакторинг вашего кода (который, вероятно, похож на опубликованный код), чтобы получить одну точку возврата, которая позволит избежать предупреждения для вашего компилятора.

7 голосов
/ 21 июня 2010

Было бы более элегантно сделать

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

Это может исключить сообщение / предупреждение вашего компилятора.

5 голосов
/ 21 июня 2010

Субъективно я согласен с постерами, утверждающими, что вы должны преобразовать это в аккуратное выражение x == y return, однако в коде нет ничего плохого.Это твой компилятор.

4 голосов
/ 21 июня 2010

Я полагаю, это опасение компилятора. Вы находитесь во вложенной области видимости, и компилятор, вероятно, проверяет оператор 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 голос
/ 21 июня 2010

Следующее также, вероятно, очистит сообщение / предупреждение компилятора.

bool RequestStatus()
{ 
   ...

   if (code == myCode) 
      return true;

   return false;
}
0 голосов
/ 21 июня 2010

Действительно ли ваш код так же прост, как фрагмент, который вы только что опубликовали?

В Delphi (также продукте Borland / CodeGear / Embarcadero) я столкнулся с той же «проблемой» с фрагментом кода wtf, который на самом деле представлял собой вложенный ifs-ад:

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, и существует путь выполнения, проходящий через исключение, которое не инициализирует ваш результат.

...