Вопрос по c – Неявное int возвращаемое значение функции C
Я гуглил и, похоже, просто не могу найти ответ на этот простой вопрос.
Работая над устаревшей кодовой базой (недавно портированной на Linux и медленно обновляющейся до нового компилятора), и я вижу много
<code>int myfunction(...) { // no return... } </code>
Я знаю, что неявный возврат TYPE функции является int, но что такое неявное возвращаемое значение VALUE, когда не указан возврат. Я проверил и получил 0, но это только с gcc. Этот компилятор специфичен или стандартно равен 0?
РЕДАКТИРОВАТЬ: 12/2017 Скорректированный принятый ответ основан на том, что он ссылается на более свежую версию стандарта.
-Wall -Werror
и посмотреть, если он все еще компилируется.
dreamlax
если вы не заполняете область возврата (которая, например, обычноeax / rax на процессорах семейства x86), это значение будет установлено последним через какой-либо побочный эффект в вашей функции.
УвидетьЯвляется ли оператор return обязательным для функций C ++, которые не возвращают void? который в основном дублирует этот вопрос (за исключением того, что он помечен как C ++).
Еслиreturn
операторы последовательно не возвращают значение, функцию лучше всего преобразовать в и объявить как возвращающуюvoid
:
void myfunction(...)
{
...
return;
...
}
Если есть некоторыеreturn expr;
и немногоreturn;
операторы в функции, то вам нужно решить, какое поведение лучше, и сделать их согласованными & # x2014; либо всегда возвращайте значение и оставляйте тип какint
или никогда не возвращать значение и изменить тип наvoid
.
Обратите внимание, что вам нужно объявить функции, измененные для возвратаvoid
(в заголовке, если они не являются & # x2014; или должны быть & # x2014;static
и скрыты в одном исходном файле), поскольку тип возвращаемого по умолчанию (предполагаемый тип возвращаемого значения)int
больше не действителен
даже если тип возвращаемого значения функции не являетсяvoid
, Диагностика не требуется, и это не неопределенное поведение.
Пример (определенное поведение):
int foo(void)
{
}
int main()
{
foo();
}
Но читая возвращаемое значениеfoo
является неопределенным поведением:
int bla = foo(); // undefined behavior
Из стандарта С:
(C99, 6.9.1p12) "If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined."
main
Функция является исключением из этого правила, как будто}
достигается вmain
это эквивалентно, как если быreturn 0;
заявление.
что это неопределенное поведение для функции, тип возвращаемой которой неvoid
опуститьreturn
заявление. В C99 есть исключение дляmain
где, еслиreturn
оператор не указан, предполагается, что он возвращает 0 неявно, но это не относится к любой другой функции.
Он может работать на определенной комбинации платформы / компилятора, но вы никогда не должны полагаться на такие особенности. Использование любого неопределенного поведения в вашем коде делает его непереносимым. Однако часто встречается неопределенное поведение в устаревшем коде.
но только при условии, что возвращаемое значение функции никогда не используется. Стандарт C11 говорит в параграфе 6.9.1:
If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.
(AFAIR предыдущая версия стандарта имела похожую формулировку)
Так что было бы неплохо преобразовать все функции такого рода, которые вы должныvoid
функции, поэтому ни у одного пользователя такой функции не может возникнуть соблазн использовать возвращаемое значение.
Flowing off the end of a function is equivalent to a return with no expression. In either case, the return value is undefined.
Этот стандарт обычно выражает практическое поведение уже существующих реализаций.
но в большинстве архитектур (конечно, в x86) оператор return перемещает содержимое определенного регистра в определенное место в стеке, которое вызывающая сторона будет извлекать и использовать в качестве своей функции возврата.
Оператор return поместит переданную ему переменную в это место, так что она будет иметь другое значение. Мой опыт с тем, чтобы не помещать конкретное выражение return, заключается в том, что это довольно случайное возвращаемое значение, и вы не можете полагаться на то, что это то же самое.