Чи робить () повернення?
Деякі компілятори для незвичайних платформ 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 для значень виходу є більш нюансованою, ніж непарною / парною. Він фактично використовує щось на зразок низьких трьох біт для кодування рівня суворості. Взагалі кажучи, однакові рівні вираженості вказували на успіх чи іншу інформацію, а парні вказували на помилки.