Подтвердить что ты не робот

Должен ли я возвращать значения 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;
}

В обзорах кода я вообще не поймал этого. Поэтому я думаю, что это не такая ужасная привычка, но она "нетрадиционная". Мне любопытно, что думают люди.

Я очень осторожно отношусь к вариантам, которые я делаю для имен функций и переменных, а типичный комментарий к обзору - это "код действительно ясный", и, кроме того, мне совсем не мешает напечатать дополнительный ! в начале вызова функции. Но что ты говоришь, о могущественных из них?

4b9b3361

Ответ 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. Просто будьте последовательными и, если есть коды ошибок, по крайней мере прокомментируйте, что они где-то означают.