Должен ли я возвращать значения TRUE/FALSE из функции C?
После программирования на C в течение нескольких лет я понял, что я игнорировал соглашение C о возврате нуля из функции для указания успеха. Для меня условность кажется мне семантической ошибкой, поскольку ноль, конечно, ложный. Проблема в том, что мне нравится называть такие функции, как is_valid_foobar()
, и для того, чтобы разместить соглашение о "ложных успехах", я должен был бы быть более расплывчатым...
это вместо:
if ( ! is_valid_foobar() ) {
return (error);
}
Другие программисты пишут:
if ( validate_foobar() ) {
return (error);
}
И моя реализация выглядит так:
int is_valid_foobar (int foobar ) {
if ( foobar < MAX_ALLOWED ) {
return TRUE;
}
return FALSE;
}
В обзорах кода я вообще не поймал этого. Поэтому я думаю, что это не такая ужасная привычка, но она "нетрадиционная". Мне любопытно, что думают люди.
Я очень осторожно отношусь к вариантам, которые я делаю для имен функций и переменных, а типичный комментарий к обзору - это "код действительно ясный", и, кроме того, мне совсем не мешает напечатать дополнительный !
в начале вызова функции. Но что ты говоришь, о могущественных из них?
Ответы
Ответ 1
Я бы сказал, что оба они верны для разных целей:
Если вы выполняете простую проверку go/no-go, например. is_numeric(), тогда true и false работают хорошо.
Для чего-то более сложного, парадигма успеха 0 == полезна в том, что она позволяет возвращать более одного условия ошибки.
В этом случае вызывающий может просто протестировать против 0 или проверить не-0 возвратов для более конкретного объяснения сбоя. например открытый вызов файла может завершиться сбоем из-за небытия, недостаточных разрешений и т.д.
Ответ 2
Соглашение не совсем то, что вы, кажется, думаете. Процессы должны выйти со статусом 0, чтобы указать успех, а функции, возвращающие коды ошибок, часто используют 0 для указания "нет ошибки". Но в качестве логического значения 0 должно означать false и ненулевое значение должно означать true. Чтобы использовать 0 для boolean true, вы попадете на The Daily WTF когда-нибудь.
Ответ 3
Прошло некоторое время с тех пор, как я запрограммировал C, но, думаю, вы говорите о двух разных функциях:
-
is_foo
- это функция, которая проверяет какое-либо свойство foo и возвращает 0
(false
) или не 0
(true
), чтобы указать логическое значение этого свойства. При вызове этих функций не ожидается состояние ошибки (и если это произойдет, оно отображается на одно из этих значений).
-
foo
- это функция, выполняющая действие foo. Он возвращает 0
при успехе и значение 0
при ошибке.
Ответ 4
Я не уверен, что согласен, что существует соглашение о возврате нуля из функции, указывающей на успех.
AFAIK, соглашение состоит в том, что ноль является ложным, и все ненулевые значения являются истинными в случае предикатов.
Однако это соглашение должно применяться только к очевидным предикатам, которые возвращают логические значения (например, true/false). Если основной целью функции является не возврат логического значения (например, printf, fopen и т.д.), Тогда возвращаемое значение используется для указания причин сбоев, а затем вы можете принять соглашение UNIX о тишине или 0, если только есть проблема ".
Что касается возвращаемых значений, нет ничего плохого в использовании фиксированных возвращаемых значений, это делает все более удобным.
Большой риск, ИМХО, заключается в том, что многие люди объявляют свои собственные константы, а когда другие используют одни и те же файлы, вы начинаете конфликты со своими собственными константами. Итак, ваш TRUE/FALSE и конфликт с кем-то другим TRUE/FALSE по линии.
Ответ 5
Особенно, когда вы называете свою функцию is_foo(), стандартные функции символов C (isdigit(), isupper() и т.д.) являются хорошим прецедентом для этого.
Ответ 6
C не имеет понятия булево, отличного от 0, как false, а что-то еще истинное.
Идея возврата 0 получается из кода возврата, указывающего на то, что происходит с ошибкой. Если вы не делаете код возврата, тогда нет ничего плохого в том, что вы обрабатываете 1 и 0 как истинные и ложные. В конце концов, TRUE и FALSE являются только typedefs для 1 и 0 в C.
Это должно быть хорошо документировано, но ваши комментарии к функциям должны сказать об экспликации "Возвращает TRUE или FALSE".
Вы также можете написать if (is_invalid_foobar()), что упростило бы утверждение и все еще семантически корректно.
Ответ 7
Это не столько соглашение C, сколько оболочка UN * X. Рассмотрим стандартные функции C iasalpha(), isdigit() и т.д. Все они возвращают ненулевое значение для указания успеха. Итог: в C 'true' отличен от нуля.
Ответ 8
Это только плохо, если он сжигает вас. Если вы никогда не заметите ошибок, я бы сказал, что все в порядке. Что более важно, это комментарий выше функции, которая начинается с "Возвращает ноль для..."
Соглашение "отличное от нуля является ошибкой" используется при попытке сказать, почему вместе с флагом ошибки.
Ответ 9
для меня, фактически проверка на 0 кажется более естественной, и компилятор ее оптимизирует в любом случае, поэтому мне нравится писать, например,
if (check_foo == 0) // делаем что-то
Ответ 10
Возвращаемое значение с помощью условных обозначений функции True и False ИЛИ Успех и ошибка:
- API и т.д. показывает успех с возвращаемым значением 0 и сбой с возвратным значением = значение ненулевой ошибки.
- Если что-то верно; возврат функций 1. Например. isStackEmpty() вернет 1, если стек пуст.
Ответ 11
По-прежнему полностью произвольно возвращать 1 или 0. Просто будьте последовательными и, если есть коды ошибок, по крайней мере прокомментируйте, что они где-то означают.