При нормальном использовании любая функция, объявленная для возврата значения, должна возвращать значение. Это во многом вопрос хорошей практики программирования. Неспособность вернуть значение часто является признаком ошибки. Однако это не требуется стандартом C, и есть два исключения.
C 2018 6.9.1 12 позволяет завершить функцию, достигнув конца ее кода без возврата значения, при условии, что вызывающая сторона не использует значение функции:
Если не указано иное, если достигается }
, завершающий функцию, и вызывающая сторона использует значение вызова функции, поведение не определено.
Один случай, когда функция может возвращать значение в одних ситуациях, а не в других, - это когда она предназначена для выполнения различных действий по команде. Например:
unsigned DoSomething(int command, int parameters[])
{
switch (command)
{
case GetSomething:
…
return Something;
case RememberSomething;
Something = parameters[0];
…
break;
}
}
Такие конструкции могут быть подвержены ошибкам и должны тщательно рассматриваться. Поскольку объявляется, что функция возвращает значение, программист может ожидать, что она это сделает, и непреднамеренно присвоит значение функции другому объекту в ситуации, когда значение не возвращается, что приводит к неопределенному поведению.
Кроме того, функция может вообще не возвращаться, и есть спецификатор функции для явного указания компилятору, что это так, _Noreturn
, как указано в 6.7.4. Такое поведение обычно используется только в нештатных ситуациях. Например, стандартные функции abort
и exit
завершают программу, поэтому они не возвращаются. Конечно, они объявлены с void
, поэтому они никогда ничего не возвращают. Однако у вас может быть функция, которая в некоторых случаях вызывает exit
, а в других возвращает целое число.