На самом деле, там различие, но это тонко. Это имеет больше последствий для C++, но различия важны.
, Когда я буду звонить return
в main()
, деструкторы назовут для моих локально ограниченных по объему объектов. Если я буду звонить exit()
, , то никакой деструктор не назовут для моих локально ограниченных по объему объектов! Перечитанный это. exit()
не возвращается . Это означает, что, как только я называю его, нет "никаких backsies". Любые объекты, которые Вы создали в той функции, не будут уничтожены. Часто это не имеет никаких последствий, но иногда это делает, как заключительные файлы (конечно, Вы хотите все свои данные, сброшенные к диску?).
Примечание, что static
объекты будут очищены, даже если Вы будете звонить exit()
. Наконец обратите внимание на то, что, если Вы используете abort()
, никакие объекты не будут уничтожены. Таким образом, никаким глобальным объектам, никаким статическим объектам и никаким локальным объектам не назовут их деструкторы.
Соблюдают осторожность при одобрении выхода по возврату.
http://groups.google.com/group/gnu.gcc.help/msg/8348c50030cfd15a
Другое различие: exit
Стандартная Библиотечная функция, таким образом, необходимо включать заголовки и ссылку со стандартной библиотекой. Для иллюстрирования (в C++) это - действительная программа:
int main() { return 0; }
, но использовать exit
Вам будет нужно то, чтобы включать:
#include <stdlib.h>
int main() { exit(EXIT_SUCCESS); }
Плюс это добавляет дополнительное предположение: тот вызов exit
от main
имеет те же побочные эффекты как возвращающий нуль. Как другие указали, это зависит от того, какой исполняемый файл Вы создаете (т.е. кто звонит main
). Вы кодируете приложение, которое использует C-время-выполнения? Плагин майя? Служба Windows? Драйвер? Каждый случай потребует, чтобы исследование видело, эквивалентно ли exit
return
. По моему скромному мнению, с помощью exit
, когда Вы действительно средний return
просто делаете код более сбивающим с толку. OTOH, если Вы действительно имеете в виду exit
, тогда любой ценой используют его.
Я всегда использую return
, потому что стандартный прототип для main()
говорит, что действительно возвращается int
.
Однако некоторые версии стандартов дают main
специальный режим и предполагают, что он возвращается 0, если нет никакого явного return
оператор. Учитывая следующий код:
int foo() {}
int main(int argc, char *argv[]) {}
G ++ только генерирует предупреждение для foo()
и игнорирует недостающий возврат от main
:
% g++ -Wall -c foo.cc
foo.cc: In function ‘int foo()’:
foo.cc:1: warning: control reaches end of non-void function