2012-03-03 3 views
35

Можно создать дубликат:
Error handling in C code
What return value should you use for a failed function call in C?Должен ли я вернуть 0 или 1 для успешной работы?

Я всегда использую 0, но его на самом деле не читаемым, если, в то время, и т.д.

Должен ли я вернуть 1? Почему главная функция возвращает 0 для успеха?

+1

Связанный вопрос был закрыт. – bernie

+0

@AdamBernier: как дубликат. У него были очень важные ответы. –

+0

@ Oli: похоже, что другой вопрос был закрыт как дубликат (возможно, я просто не вижу его). Тем не менее, я согласен с закрытием этого и одного: вопросы для этого конкретного сайта кажутся слишком открытыми. – bernie

ответ

33

Он определяется стандартом C как 0 для успеха (кредиты идут на hvd).

But

Для большей мобильности, вы можете использовать макросы EXIT_SUCCESS и EXIT_FAILURE для обычного значения состояния для успеха и неудач соответственно. Они объявляются в файле stdlib.h.

(я говорю о стоимости возвращается к ОС от основной, выход или подобные вызовы)

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

+0

0 всегда означает успех, но другим кодам выхода также разрешено означать успех в зависимости от системы. – hvd

+0

@hvd Это неправда. Значения 'EXIT_SUCCESS' и' EXIT_FAILURE' не определены в стандарте C. –

+2

@AndrewMarshall 'EXIT_SUCCESS' может иметь какое-то другое значение, кроме 0, но даже тогда' return 0; '* также * означает успех. – hvd

-4

Если вы возвращаете состояние boolean, вы можете ввести typedef в int и использовать его. Это делает возвращаемый тип ваших функций очевидным, и вам (и другим) не придется проверять, возвращает ли он 0 или 1 для good.

typedef int BOOL; 
#ifndef TRUE 
#define TRUE 1 
#endif 

#ifndef FALSE 
#define FALSE 0 
#endif 

BOOL myfunc() 
{ 
    ... 
    return TRUE; 
} 
+9

Зачем вам воссоздавать стандартный тип 'bool'? – hvd

+0

@hvd Я думаю, что это было бы ошибкой, так как вы получили бы ошибки, если бы вы когда-либо скомпилировали код с C++ в будущем. Вы могли бы выбрать другие имена, например, 'bool_t' или что-то еще. – trojanfoe

+2

И в C, и в C++ вы можете '#include ' и использовать тип 'bool', не определяя его вручную как typedef.В C++ вам не нужен '', но он разрешен и безвреден, и его можно легко обернуть в' #ifdef __cplusplus', если это необходимо. – hvd

10

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

Внутри приложения, однако, это более естественно использовать нуль для отказа и ненулевого успеха, так как возвращаемое значение может быть непосредственно использованы в a if как в:

if (my_func()) 
{ 
    ... 
} 
Смежные вопросы