С ++ возвращает 0 или NULL в случае неудачи? - PullRequest
1 голос
/ 08 января 2012

Каково значение возврата в случае сбоя программы на C ++? Я прочитал несколько статей по этому вопросу, но ничего не ясно.

Если он не возвращает 0, есть ли способ заставить программу вернуть 0 или NULL при ошибке? Я кое-что рассказал о std :: nothrow, но пока не нашел практических примеров. Кто-нибудь может мне это уточнить?

Ответы [ 6 ]

9 голосов
/ 08 января 2012

Стандарт определяет коды ошибок EXIT_SUCCESS и EXIT_FAILURE с очевидными значениями.Они могут быть переданы либо в exit() функцию, либо явно возвращены с помощью оператора return из функции main.Вы можете обернуть всю функцию main как

int main() try {
...
} catch(...) {
 return EXIT_SUCCESS;
}

В противном случае ваш вопрос неясен.

4 голосов
/ 08 января 2012

NULL - это просто макрос для 0, насколько я знаю.

В stdlib.h:

/* Define NULL pointer value */

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif 

Источник (немецкий), куда я скопировалэто также означает, что Stroustrup не рекомендует использовать NULL.

1 голос
/ 08 января 2012

Вопрос немного неясен.Значение, которое вы возвращаете из main, является в точности значением, которое вы передаете оператору return в main.Больше ничего нельзя сказать об этом.

Теперь, какой вопрос вы действительно должны задавать?Есть два аспекта: один - сторона C ++, а другой - сторона хоста (то есть операционная система).

У вас нет никакого контроля над тем, как любая конкретная операционная система обрабатывает состояния ошибок программ, которыеэто запускает.Единственное, что гарантирует стандарт C ++, это:

  • Если ваш main возвращает 0, EXIT_SUCCESS или нет вообще, то программа завершается таким образом, чтосигнализирует об успехе;и

  • , если ваш main возвращает EXIT_FAILURE, то программа завершается способом, который сигнализирует об ошибке.

Фактические возвращаемые значениявашей программы полностью зависят от платформы, то есть от операционной системы и среды выполнения.

Например, в Linux об успешном сообщении сообщается через значение 0, а об ошибке - через ненулевое значение, так что C или C ++Программа может быть выполнена, просто возвращая значение main() обратно в ОС (и определяя EXIT_SUCCESS как 0).Другие платформы могут выбирать другую семантику!

0 голосов
/ 08 января 2012

Успешные запуски обычно имеют код ошибки 0, все, кроме 0, указывает на какую-то ошибку.

Error code                     Value              Description
ERROR_SUCCESS                    0            The action completed successfully.
ERROR_INVALID_DATA               13           The data is invalid.
ERROR_INVALID_PARAMETER          87           One of the parameters was invalid.

Подробнее: http://msdn.microsoft.com/en-us/library/windows/desktop/aa368542(v=vs.85).aspx

0 голосов
/ 08 января 2012

NULL - это макрос, и он равен sa 0, он определен примерно так:

#define NULL 0

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

если программа выполняется успешно, она всегда возвращает 0. Если при сбое программы вы никогда не вернете значение, отличное от 0, вы не будете знать,не удалось или нет.

также, если возвращаемое значение меньше, чем n, что также означает сбой.так что только значение sucess равно 0 или NULL, что является одинаковым.

0 голосов
/ 08 января 2012

Обычно считается, что программа возвращает 0 в случае успеха и ненулевое значение в противном случае.

Вы устанавливаете возвращаемое значение, возвращаясь из основной функции:

int main(int argc, char ** argv){
  return 0; // Finish with success
}

илипередав код возврата в функцию exit(int).

Также стоит отметить, что NULL определен точно как (void*)0 и используется, когда речь идет об указателях, а не о целых числах.Если вы не понимаете, что это значит, прочитайте приличный учебник по Си.

...