2010-06-21 2 views
4

Учитывая функцию, как такФункция должна возвращать Значение Вопрос

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

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

+0

Какой компилятор и платформа вы используете? –

+0

C++ - builder-5 windows xp – 2010-06-21 14:15:19

+0

из любопытства, какой компилятор вы используете? Я думаю, что ваш вопрос с квантовой вероятностью, хотя .. что-то может быть ясно X или нет X, но вы не справляетесь с возможностью того, что X не является даже подмножеством всех существующих вещей! –

ответ

23

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

+0

Правда, но это не отвечает на вопрос. –

+0

Я не знаю этого точного компилятора, но чтобы избежать ошибки, компилятор должен был бы сортировать счет на своих пальцах независимо от того, что каждый возможный путь (if и else of if if) что-то возвращает. Кажется, что счастливее найти линию вне любых условий, которые возвращаются. Переписывая в одну строку без необходимости, как я уже сказал, сделает компилятор счастливее. –

+1

После двух дополнительных лет созревания SWE, я пришел, чтобы принять это как доктрину. – 2012-04-26 16:59:59

6

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

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

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

10

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

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

+0

Действительно. C++ Builder 5 не исчерпывающе проверяет такие условия. (Не похоже на C#, где сама спецификация _mandates_ их поймает!). И избежать таких предупреждений с помощью C++ Builder не всегда легко, потому что то, что проверяет компилятор, зависит от параметров компиляции. Исправьте предупреждение в сборке отладки, и он иногда возвращается в сборку релиза, и наоборот :-( – user192472

+0

Спасибо, Брайан. Я закончил рефакторинг всего этого, и теперь это намного лучше. – 2010-06-21 16:42:52

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); 

чище.

+0

Ах, но если логика 1 не пройдет, то логика 2 пройдет так, зачем положить оператор возврата в конце? – 2010-06-21 14:17:40

+0

Ну, в этом случае, я думаю, большинство из нас согласятся, что * ничего не происходит после утверждения if (следовательно, вопрос OP ..) – phtrivier

5

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

1

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

bool RequestStatus() 
{ 
    ... 

    if (code == myCode) 
     return true; 

    return false; 
} 
0

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

В Delphi (также продукт Borland/CodeGear/Embarcadero), я столкнулся с той же "проблема" на куске 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... 

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

У вас также может быть предупреждение, если ваш код находится внутри блока try/except, и есть путь выполнения, проходящий через исключение, которое не инициализирует ваш результат.

+0

Это на самом деле это просто – 2010-06-21 16:42:17

Смежные вопросы