Ответ 1
В GNU libc exit
объявляется с помощью __attribute__((__noreturn__))
, который сообщает gcc, что функция не возвращается.
Если я использую exit()
, GCC не дает предупреждения:
int main()
{
exit(EXIT_SUCCESS);
}
Если мы будем использовать любую другую функцию, мы обязательно встретим такое предупреждение:
warning: control reaches end of non-void function
Как exit()
заставить родительскую функцию получить свое возвращаемое значение без использования return()
, что делает компилятор?
В GNU libc exit
объявляется с помощью __attribute__((__noreturn__))
, который сообщает gcc, что функция не возвращается.
Из документы:
Аргумент статуса возвращается в среду хоста.
и
Выдача оператора возврата из основной функции эквивалентна вызову функции exit с возвращаемым значением в качестве аргумента.
Это реализовано (в данном случае) с помощью атрибута объявления функции (__noreturn__
), который сообщает компилятору, что его можно рассматривать как возврат (или, вернее, что функция не вернется, поэтому управление никогда не будет доходят до конца основного).
вместо
exit(EXIT_SUCCESS);
есть
return(EXIT_SUCCESS);
Проблема заключается в том, что вы не включили stdlib.h
и не компилируете с помощью -std=c99
. В C99 main
неявно возвращает 0, если вы запустили его конец.