Mam zwracać EXIT SUCCESS czy 0 z main ()?

To proste pytanie, ale ciągle widzę sprzeczne odpowiedzi: czy główna rutyna programu C++ powinna zwracać 0 Czy EXIT_SUCCESS?

#include <cstdlib>
int main(){return EXIT_SUCCESS;}

Lub

int main(){return 0;}
Czy to dokładnie to samo? Czy EXIT_SUCCESS należy stosować tylko z exit()?

Myślałem, że EXIT_SUCCESS będzie lepszą opcją, ponieważ inne programy mogą chcieć uznać zero za porażkę, ale słyszałem też, że jeśli zwrócisz 0, kompilator i tak będzie w stanie zmienić go na inną wartość.

Author: Jamal, 2012-01-15

8 answers

EXIT_FAILURE, zarówno w instrukcji return w main, jak i jako argument exit(), jest jedynym przenośnym sposobem Wskazywania błędu w programie C lub c++. Może na przykład sygnalizować pomyślne zakończenie pracy maszyn wirtualnych.

Jeśli zamierzasz używać EXIT_FAILURE kiedy twój program zawiedzie, możesz równie dobrze użyć EXIT_SUCCESS Kiedy się powiedzie, tylko ze względu na symetrię.

Z drugiej strony, jeśli program nigdy nie sygnalizuje awarii, możesz użyć 0 lub EXIT_SUCCESS. Oba są gwarantowane przez standard, aby zasygnalizować pomyślne zakończenie. (Jest ledwo możliwe, że EXIT_SUCCESS może mieć wartość inną niż 0, ale jest równa 0 w każdej implementacji, o której kiedykolwiek słyszałem.)

Użycie 0 ma tę drobną zaletę, że nie potrzebujesz #include <stdlib.h> W C, ani #include <cstdlib> W C++ (jeśli używasz instrukcji return zamiast wywoływania exit()) -- ale dla programu o dowolnej znaczącej wielkości i tak będziesz włączał stdlib bezpośrednio lub pośrednio.

W tym przypadku, w C począwszy od standardu z 1999 roku, a we wszystkich wersjach C++, sięgając końca main() robi implicit return 0; i tak, więc może nie trzeba używać ani 0 ani EXIT_SUCCESS jawnie. (Ale przynajmniej w C, uważam jawne return 0; za lepszy styl.)

(ktoś pytał o OpenVMS. Nie używałem go od dłuższego czasu, ale z tego, co pamiętam, dziwne wartości statusu generalnie oznaczają sukces, podczas gdy parzyste wartości oznaczają porażkę. Map implementacji C 0 do 1, tak że return 0; wskazuje pomyślne zakończenie. Inne wartości są przekazywane bez zmian, więc return 1; również wskazuje pomyślne zakończenie. EXIT_FAILURE mA niezerową wartość parzystą.)

 164
Author: Keith Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-06 07:29:42

To nie ma znaczenia. Oba są takie same.

C++ Standard Quotes:

Jeżeli wartością statusu jest zero lub EXIT_SUCCESS, zwracana jest zdefiniowana przez implementację forma zakończenia statusu pomyślnego.

 27
Author: Alok Save,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 06:19:18

0 jest z definicji liczbą magiczną. EXIT_SUCCESS jest prawie powszechnie równe 0, Na szczęście. Dlaczego więc po prostu nie wrócić / wyjść 0?

Exit (EXIT_SUCCESS); jest obficie jasne w znaczeniu.

Exit (0); z drugiej strony jest pod pewnymi względami przeciwstawny. Ktoś nie zaznajomiony z zachowaniem powłoki może założyć, że 0 = = false = = bad, podobnie jak każde inne użycie 0 W C. Ale nie - w tym szczególnym przypadku, 0 = = sukces = = dobry. Dla najbardziej doświadczonych programistów, nie będzie problem. Ale po co podrywać nowego bez żadnego powodu?

TL;dr-jeśli istnieje określona stała dla Twojej liczby magicznej, prawie nigdy nie ma powodu, aby jej nie używać. Jest bardziej przeszukiwalny, często jaśniejszy itp. i nic cię to nie kosztuje.

 13
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 06:50:15

Jest to niekończąca się historia, która odzwierciedla granice (mit) "interoperacyjności i przenośności nad wszystkim".

To, co program powinien zwrócić, aby wskazać "sukces", powinno być zdefiniowane przez to, kto otrzymuje wartość (system operacyjny lub proces, który wywołał program), a nie przez specyfikację języka.

Ale programiści lubią pisać kod w "przenośny sposób" i dlatego wymyślają własny model dla pojęcia "systemu operacyjnego" definiujący wartości symboliczne do / align = "left" /

Teraz, w scenariuszu wielu do wielu (gdzie wiele języków służy do pisania programów do wielu systemów) korespondencja między konwencją językową "sukcesu" a systemem operacyjnym (którego nikt nie może przyznać, aby był zawsze taki sam) powinna być obsługiwana przez konkretną implementację biblioteki dla konkretnej platformy docelowej.

Ale - niestety - te koncepcje, w których nie było tak jasno w czasie wdrażania języka C (głównie do pisania jądra Uniksa), i Gigagramy książek, gdzie napisane przez powiedzenie "return 0 means success", ponieważ było to prawdą na OS w tym czasie mając kompilator C.

Od tego czasu nie dokonano jasnej standaryzacji sposobu postępowania z taką korespondencją. C i C++ mają swoją własną definicję "wartości zwrotnych", ale nikt nie udziela odpowiedniego tłumaczenia systemu operacyjnego(lub lepiej: Żadna dokumentacja kompilatora nic o tym nie mówi). 0 oznacza sukces, jeśli jest prawdziwy Dla UNIX-LINUX i-z niezależnych powodów-dla Windows, a także obejmuje to 90% istniejących "komputerów konsumenckich", które - w większości przypadków - pomijają wartość zwrotu (więc możemy dyskutować przez dziesięciolecia, bu nikt nigdy nie zauważy!)

Wewnątrz tego scenariusza, przed podjęciem decyzji, zadaj te pytania: - Czy jestem zainteresowany, aby przekazać coś do mojego rozmówcy o moim istniejącym? (Jeśli tylko zawsze zwracam 0 ... za tym wszystkim nie ma pojęcia) - Czy mój rozmówca ma konwencje odnośnie tej komunikacji ? (Zauważ, że pojedyncza wartość nie jest convention: that doesn ' t allow any information representation)

Jeśli obie te odpowiedzi są nie, prawdopodobnie dobrym rozwiązaniem jest nie pisać głównej instrukcji return w ogóle. (I niech kompilator zdecyduje, w odniesieniu do celu pracuje).

Jeśli nie ma konwencji 0=sukces spełnia większość sytuacji(a używanie symboli może być problematyczne, jeśli wprowadzą konwencję).

Jeśli istnieją konwencje, upewnij się, że używasz stałych symbolicznych, które są spójność z nimi (i zapewnienie spójności Konwencji, a nie spójności wartości, między platformami).

 10
Author: Emilio Garavaglia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-01 18:32:42

Gdy zaczniesz pisać kod, który może zwracać niezliczone statusy wyjścia, zaczynasz #define'wszystkie z nich. W tym przypadku EXIT_SUCCESS ma sens w kontekście nie bycia " liczbą magiczną ". To sprawia, że Twój kod jest bardziej czytelny, ponieważ każdy inny kod zakończenia będzie EXIT_SOMETHING. Jeśli po prostu napiszesz program, który powróci po zakończeniu, return 0 jest poprawny, a prawdopodobnie nawet czystszy, ponieważ sugeruje, że nie ma wyrafinowanej struktury kodu zwrotnego.

 4
Author: Phonon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 09:36:30

To, co zwracasz z programu, to tylko konwencja.

Nie, Nie mogę wymyślić żadnych okoliczności, w których "EXIT_SUCCESS" nie byłoby "0".

Osobiście polecam "0".

IMHO...

 1
Author: paulsm4,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 06:12:41

Jeśli użyjesz EXIT_SUCCESS, Twój kod będzie bardziej przenośny.

Http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/

 -4
Author: Mohammad Moghimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 06:13:24

Niektóre Kompilatory mogą powodować problemy z tym-na kompilatorze Mac C++ EXIT_SUCCESS działał mi dobrze, ale na kompilatorze Linux C++ musiałem dodać cstdlib, aby wiedział, co to jest EXIT_SUCCESS. Poza tym są one jednym i tym samym.

 -5
Author: Ambidextrous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 06:24:07