2014-11-20 2 views
3

Say функция в С логического типа возврата (логическое значение может быть реализован в виде перечисления 0 и 1 или каким-либо другим способом, но это не важно):Что возвращается; в функции C возвращаемого типа возврата boolean?

boolean foo() 
{ 
    //do something 

    return; 
} 

Что это возвращение? он возвращает FALSE? или он просто выходит из функции без какого-либо возврата? что будет ожидать функция, ожидающая возвращения из foo?

+1

Это неопределенное поведение, нет? Ваш компилятор должен жаловаться на это. – OldProgrammer

+2

Когда вы не уверены, запустите код. – Maroun

+0

Если вы добавите 'FALSE' после' return', то он вернет 'FALSE'. Если вы добавите 'TRUE' после' return', то он вернет 'TRUE'. Функция, вызывающая 'foo', должна ожидать значение' boolean'. –

ответ

7

Это неопределенное поведение, оператор return без выражения должен использоваться только в функции, тип возврата которой недействителен. Это описано в разделе draft C99 standard6.8.6.4Возвращение заявления:

[...]A return statement without an expression shall only appear in a function whose return type is void.

Интересно, что это ошибка по умолчанию при использовании clang но gcc без каких-либо флагов, кажется, чтобы этот код даже без предупреждения. Для gcc, используя -std=c99, это превращает это в предупреждение, и использование флага -pedantic-errors делает его ошибкой.

Хороший набор флагов, чтобы привыкнуть к использованию при компиляции программ C с использованием либо gcc или clang будет следующим:

-std=c99 -Wall -Wextra -Wconversion -pedantic

Регулировка -std соответствующего стандарту вы ориентируетесь.

+0

Чтобы скомпилировать код как код C с помощью gcc, вы _must_ используете '-std = cXX -pedantic-errors'. Если вы не включаете эти два варианта, gcc остается куском дерьма, а не хорошим, строго соответствующим компилятору, который может быть установлен. – Lundin

+0

@ Lundin Я обычно тестирую, используя, наконец, '-std = c99 -Wall -Wextra -Wconversion -pedantic', но, похоже, большинство людей не используют флаги. –

3

Согласно (проект) C99 стандарта, раздел 6.8.6.4 The return statement (пункт 1):

A return statement with an expression shall not appear in a function whose return type is void. A return statement without an expression shall only appear in a function whose return type is void.

Так что код будет недействителен.

Компиляция с использованием GCC с -Wall выдает ошибку:

warning: 'return' with no value, in function returning non-void [-Wreturn-type]

Хотя он компилирует, когда не используется -Wall и возвращает 1 (истина), но я предполагаю, что это GCC быть хорошим (?) ,

(взято из WG14/N1256 комитета проекта - Septermber 7, 2007 ISO/IEC 9899: ТС3)

0

с видом на тот факт, что этот код будет иметь неопределенное поведение, поскольку отсутствует значение для возвращения заявления. ...

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

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

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