Является ли оператор return обязательным для функций C ++, которые не возвращают void?
10120 просмотра
7 ответа
Моя книга Херба Шильдта о C ++ гласит: «... В C ++, если функция объявлена как возвращающая значение, она должна вернуть значение». Однако, если я пишу функцию с типом возврата, не являющимся void, и ничего не возвращаю, компилятор выдает предупреждение вместо ошибки: «Управление достигает конца функции, не являющейся void».
Я использую gcc (MinGW) и установил флаг -pedantic.
Автор: AlwaysLearning Источник Размещён: 12.11.2019 09:38Ответы (7)
27 плюса
§6.6.3 / 2:
Выпуск из конца функции эквивалентен возврату без значения; это приводит к неопределенному поведению в функции, возвращающей значение.
Так что это зависит от вашего определения обязательно. Ты должен ? Нет. Но если вы хотите, чтобы ваша программа имела четко определенное поведение, да. *
* main
является исключением, см. §3.6.1 / 5. Если контроль достигает конца main
без return
, он будет иметь эффект return 0;
.
10 плюса
Это обязательно - это неопределенное поведение, когда такая функция завершается, ничего не возвращая (поэтому компиляторы могут фактически реализовать какое-то специальное поведение). Однако есть несколько особых случаев.
::main
является исключением, предполагается, что return 0;
находится в конце своего кода.
Кроме того, вам не нужно возвращать значение в функции, которая не возвращает чисто, например:
int Foo() {
throw 42;
}
Автор: liori
Размещён: 06.05.2010 08:14
6 плюса
Не обязательно иметь оператор return в функции, объявленной как возвращающий не void, и это не должно приводить к неопределенному поведению.
Такая функция могла бы:
- Не вернуть, скажем, введя бесконечный цикл
- Возврат с помощью исключения
- Вызовите функцию, которая сама не возвращает, например,
std::terminate
Конечно, если функция избегает неопределенного поведения, всегда выполняя одно из вышеперечисленных, ее, вероятно, не следует объявлять возвращающим не void, если это возможно.
Один очевидный случай, когда это необходимо - это виртуальная функция, которая для определенной точки в иерархии классов не может возвращать допустимое значение и всегда завершается через исключение.
Автор: CB Bailey Размещён: 06.05.2010 08:224 плюса
Да, он должен возвращать значение.
Выпуск из конца функции эквивалентен возврату без значения; это приводит к неопределенному поведению в функции, возвращающей значение.
Этот вопрос принесет больше света на предмет
Автор: Tom Размещён: 06.05.2010 08:061 плюс
Это обязательно? Я не верю в это, однако не возвращать значение в функции, не возвращающей пустоту, не определено в соответствии с моим пониманием стандартов c ++ (за исключением main, который возвращает 0).
Значит ли это, что все в порядке? Вероятно, нет - если функция должна возвращать значение, вы должны возвращать значение, которое может привести к путанице в сложных кодах.
Автор: cmjreyes Размещён: 06.05.2010 08:111 плюс
Если вы забудете включить return
оператор в некоторый управляющий путь функции, возвращающей значение, это не сделает ваш код плохо сформированным. Т.е. вы обычно должны ожидать компиляции кода (возможно, с предупреждением). В этом смысле это не «обязательно».
Однако фактическое выпадение из функции возврата значения в C ++ всегда неопределенное поведение. (В C это неопределенное поведение, только если вызывающий код фактически использует результат.)
Автор: AnT Размещён: 06.05.2010 08:240 плюса
Как сказал GMan, единственным исключением является основная функция. Я до сих пор вижу тонны книг, возвращающих 0 в основном, что не является действительно необходимым. О, хорошо, я думаю, что могло быть и хуже, и вы могли бы учиться из книги, которая использует void main () вместо int main (). Но я думаю, что вы должны извлечь из всего этого, что ваш компилятор жалуется по какой-то причине, и это хорошо, что вы приняли это к сведению, так как это, как правило, избавит вас от головной боли в долгосрочной перспективе.
Автор: daveangel Размещён: 07.05.2010 07:42Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- c++ Что такое виртуальный базовый класс в C ++?
- c++ В чем разница между #include <filename> и #include "filename"?
- c++ Какой самый лучший бесплатный детектор утечки памяти для программы на C / C ++ и ее подключаемых библиотек DLL?
- c++ Как преобразовать std :: string в LPCWSTR в C ++ (Unicode)
- c++ Regular cast vs. static_cast vs. dynamic_cast
- c++ Синтаксические стили C ++
- c++ Как прочитать значение из реестра Windows
- c++ Какие компиляторы C ++, если таковые имеются, выполняют оптимизацию хвостовой рекурсии?
- c++ Каковы различия между «универсальными» типами в C ++ и Java?
- c++ Как добавить отражение в приложение C ++?
- c++ Как мне вызвать :: CreateProcess в C ++ для запуска исполняемого файла Windows?
- c++ Почему порядок, в котором связаны библиотеки, иногда вызывает ошибки в GCC?
- c++ Как вы обнаруживаете / избегаете утечки памяти в вашем (неуправляемом) коде?
- c++ Как вы устанавливаете, очищаете и переключаете один бит?
- c++ Вызов python из программы c ++ для распространения