Никогда не следует использовать EXIT_SUCCESS
или EXIT_FAILURE
вне контекста вызова exit()
или возвращаемого значения main()
. Значения этих целых чисел не определены стандартом, поэтому вы не можете написать переносимый код, если предположите, что они равны 0 или 1 соответственно.
Стандарт определяет, что exit(0)
и return 0
из main()
ведут себя так же, как exit(EXIT_SUCCESS)
и return EXIT_SUCCESS
, но эти значения являются "особыми" в том смысле, что они должны интерпретироваться в реализации определенным образом. То есть фактическое значение, передаваемое в систему, может не быть 0, а постоянное значение EXIT_SUCCESS
может быть не равным 0, если этого требует реализация, при условии, что return 0
из основного и return EXIT_SUCCESS
из основного ведут себя так же.
Если вы используете эти значения в своих функциях, ваши вызывающие абоненты должны будут сравнивать с EXIT_SUCCESS
напрямую, чтобы определить, была ли функция выполнена успешно, что лично мне показалось бы очень неудобным.
int MyFunction1 () { /* ... */ return EXIT_SUCCESS; }
int MyFunction2 () { /* ... */ return 0; }
// Portable:
if (MyFunction1 () == EXIT_SUCCESS) { ... }
if (MyFunction2 () == 0) { ... }
if (!MyFunction2 ()) { ... }
// Not portable:
if (MyFunction1 () == 0) { ... }
if (!MyFunction1 ()) { ... }
if (MyFunction2 () == EXIT_SUCCESS) { ... }
Проблема становится более очевидной с EXIT_FAILURE
:
int MyFunction1 () { /*... */ return EXIT_FAILURE; }
// Not portable
if (MyFunction1 ()) { ... }
if (MyFunction1 () == 1) { ... }
// The only way to make this portable.
if (MyFunction1 () == EXIT_FAILURE) { ... }