Является ли оператор return обязательным для функций C ++, которые не возвращают void?

c++

10120 просмотра

7 ответа

96 Репутация автора

Моя книга Херба Шильдта о C ++ гласит: «... В C ++, если функция объявлена ​​как возвращающая значение, она должна вернуть значение». Однако, если я пишу функцию с типом возврата, не являющимся void, и ничего не возвращаю, компилятор выдает предупреждение вместо ошибки: «Управление достигает конца функции, не являющейся void».

Я использую gcc (MinGW) и установил флаг -pedantic.

Автор: AlwaysLearning Источник Размещён: 06.05.2010 08:04

Ответы (7)


4 плюса

32370 Репутация автора

Да, он должен возвращать значение.

Выпуск из конца функции эквивалентен возврату без значения; это приводит к неопределенному поведению в функции, возвращающей значение.

Этот вопрос принесет больше света на предмет

Автор: Tom Размещён: 06.05.2010 08:06

1 плюс

206 Репутация автора

Это обязательно? Я не верю в это, однако не возвращать значение в функции, не возвращающей пустоту, не определено в соответствии с моим пониманием стандартов c ++ (за исключением main, который возвращает 0).

Значит ли это, что все в порядке? Вероятно, нет - если функция должна возвращать значение, вы должны возвращать значение, которое может привести к путанице в сложных кодах.

Автор: cmjreyes Размещён: 06.05.2010 08:11

27 плюса

314822 Репутация автора

§6.6.3 / 2:

Выпуск из конца функции эквивалентен возврату без значения; это приводит к неопределенному поведению в функции, возвращающей значение.

Так что это зависит от вашего определения обязательно. Ты должен ? Нет. Но если вы хотите, чтобы ваша программа имела четко определенное поведение, да. *

* mainявляется исключением, см. §3.6.1 / 5. Если контроль достигает конца mainбез return, он будет иметь эффект return 0;.

Автор: GManNickG Размещён: 06.05.2010 08:12

10 плюса

30563 Репутация автора

Это обязательно - это неопределенное поведение, когда такая функция завершается, ничего не возвращая (поэтому компиляторы могут фактически реализовать какое-то специальное поведение). Однако есть несколько особых случаев.

::mainявляется исключением, предполагается, что return 0;находится в конце своего кода.

Кроме того, вам не нужно возвращать значение в функции, которая не возвращает чисто, например:

int Foo() {
    throw 42;
}
Автор: liori Размещён: 06.05.2010 08:14

6 плюса

558674 Репутация автора

Не обязательно иметь оператор return в функции, объявленной как возвращающий не void, и это не должно приводить к неопределенному поведению.

Такая функция могла бы:

  • Не вернуть, скажем, введя бесконечный цикл
  • Возврат с помощью исключения
  • Вызовите функцию, которая сама не возвращает, например, std::terminate

Конечно, если функция избегает неопределенного поведения, всегда выполняя одно из вышеперечисленных, ее, вероятно, не следует объявлять возвращающим не void, если это возможно.

Один очевидный случай, когда это необходимо - это виртуальная функция, которая для определенной точки в иерархии классов не может возвращать допустимое значение и всегда завершается через исключение.

Автор: CB Bailey Размещён: 06.05.2010 08:22

1 плюс

269902 Репутация автора

Если вы забудете включить returnоператор в некоторый управляющий путь функции, возвращающей значение, это не сделает ваш код плохо сформированным. Т.е. вы обычно должны ожидать компиляции кода (возможно, с предупреждением). В этом смысле это не «обязательно».

Однако фактическое выпадение из функции возврата значения в C ++ всегда неопределенное поведение. (В C это неопределенное поведение, только если вызывающий код фактически использует результат.)

Автор: AnT Размещён: 06.05.2010 08:24

0 плюса

553 Репутация автора

Как сказал GMan, единственным исключением является основная функция. Я до сих пор вижу тонны книг, возвращающих 0 в основном, что не является действительно необходимым. О, хорошо, я думаю, что могло быть и хуже, и вы могли бы учиться из книги, которая использует void main () вместо int main (). Но я думаю, что вы должны извлечь из всего этого, что ваш компилятор жалуется по какой-то причине, и это хорошо, что вы приняли это к сведению, так как это, как правило, избавит вас от головной боли в долгосрочной перспективе.

Автор: daveangel Размещён: 07.05.2010 07:42
Вопросы из категории :
32x32