Итак, как работает exit()?

Если я использую exit(), GCC не дает предупреждения:

int main()
{
    exit(EXIT_SUCCESS);
}

Если мы будем использовать любую другую функцию, мы обязательно встретим такое предупреждение:

warning: control reaches end of non-void function

Как exit() заставить родительскую функцию получить свое возвращаемое значение без использования return(), что делает компилятор?

Ответ 1

В GNU libc exit объявляется с помощью __attribute__((__noreturn__)), который сообщает gcc, что функция не возвращается.

Ответ 2

Из документы:

Аргумент статуса возвращается в среду хоста.

и

Выдача оператора возврата из основной функции эквивалентна вызову функции exit с возвращаемым значением в качестве аргумента.

Это реализовано (в данном случае) с помощью атрибута объявления функции (__noreturn__), который сообщает компилятору, что его можно рассматривать как возврат (или, вернее, что функция не вернется, поэтому управление никогда не будет доходят до конца основного).

Ответ 3

вместо

 exit(EXIT_SUCCESS);

есть

 return(EXIT_SUCCESS);

Ответ 4

Проблема заключается в том, что вы не включили stdlib.h и не компилируете с помощью -std=c99. В C99 main неявно возвращает 0, если вы запустили его конец.