Чи робить () повернення?
Деякі компілятори для незвичайних платформ exit()
можуть перевести його аргумент у значення виходу вашої програми, тоді як повернення з main()
просто може передати значення безпосередньо в середовище хоста без будь-якого перекладу.
Стандарт вимагає однакової поведінки в цих випадках (конкретно, він говорить, що повернення чогось, що є int
сумісним, main()
повинно бути еквівалентним виклику exit()
з цим значенням). Проблема полягає в тому, що різні ОС мають різні умови інтерпретації значень виходу. У багатьох системах (МНОГО!) 0 означає успіх, а все інше - невдачу. Але, скажімо, VMS, непарні значення означають успіх, а парні - невдачу. Якщо ви повернули 0 з main()
, користувач VMS побачить неприємне повідомлення про порушення доступу. Насправді не було порушення доступу - це було просто стандартне повідомлення, пов’язане з кодом відмови 0.
Потім ANSI підійшов і благословив EXIT_SUCCESS
і EXIT_FAILURE
як аргументи, які ви могли передати exit()
. Стандарт також говорить , що exit(0)
повинен вести себе так само exit(EXIT_SUCCESS)
, тому більшість реалізацій визначають EXIT_SUCCESS
в 0
.
Таким чином, стандарт прив'язує вас до VMS, оскільки він не залишає стандартного способу повернення коду відмови, який, мабуть, має значення 0.
Тому компілятор VAX / VMS C початку 1990-х років не інтерпретував повернене значення main()
, а просто повертав будь-яке значення хост-середовищу. Але якщо ви використовуєте, exit()
це зробить те, що вимагає стандарт: перекладіть EXIT_SUCCESS
(або 0
) в код успіху і EXIT_FAILURE
в загальний код відмови. Щоб користуватися EXIT_SUCCESS
, вам довелося передати його exit()
, ви не змогли повернути його main()
. Я не знаю, чи зберегли таку поведінку більш сучасні версії цього компілятора.
Портативна програма С, яка виглядала так:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
Убік: Якщо я пам'ятаю правильно, умова VMS для значень виходу є більш нюансованою, ніж непарною / парною. Він фактично використовує щось на зразок низьких трьох біт для кодування рівня суворості. Взагалі кажучи, однакові рівні вираженості вказували на успіх чи іншу інформацію, а парні вказували на помилки.