Jaki jest prawidłowy (najbardziej wydajny) sposób zdefiniowania main()
funkcji w C i C ++ - int main()
lub void main()
- i dlaczego? Jeśli int main()
to return 1
lub return 0
?
Istnieje wiele duplikatów tego pytania, w tym:
- Jakie są prawidłowe podpisy
main()
funkcji C ? - Zwracany typ
main()
funkcji - Różnica między
void main()
iint main()
? main()
podpis w C ++- Jaka jest właściwa deklaracja
main()
? - Dla C ++, z bardzo dobrą odpowiedzią. - Style
main()
funkcji w C. - Zwraca typ
main()
metody w C int main()
vsvoid main()
w C
Związane z:
- C ++ -
int main(int argc, char **argv)
- C ++ -
int main(int argc, char *argv[])
- Czy
char *envp[]
to trzeci argument dlamain()
przenośnych? - Czy
int main()
funkcja musi zwracać wartość we wszystkich kompilatorach? - Dlaczego typ
main()
funkcji w C i C ++ pozostawiono użytkownikowi do zdefiniowania? - Dlaczego się
int main(){}
kompiluje? - Definicje prawne
main()
w C ++ 14?
c++
c
return-value
main
return-type
Joel
źródło
źródło
main
jest wywoływany raz (aw C ++ można wywoływać tylko raz: brak rekurencji). Jeśli nie chcesz, aby wykonywanie spędzało dużo czasumain
, nie wywoływaj programu wiele razy: spraw, aby program zaimplementował powtórzenie.#include
oświadczeńreturn
wmain(...)
na wbudowanym urządzeniu, system przechodzi w stan nieprzewidywalny i pralka będzie świadomym i próbować cię zabić. Tak więc używamyvoid main()
w tym przypadku. Jest to standardowa praktyka przemysłowa w osadzaniu goły metal.Odpowiedzi:
Wartość zwracana dla
main
wskazuje, jak program zakończył pracę. Normalne wyjście jest reprezentowane przez 0 zwracaną wartość zmain
. Nieprawidłowe wyjście jest sygnalizowane zwrotem niezerowym, ale nie ma standardu interpretacji kodów niezerowych. Jak zauważają inni,void main()
jest to zabronione przez standard C ++ i nie powinno się go używać. Prawidłowemain
podpisy w C ++ to:i
co jest równoważne z
Warto również zauważyć, że w C ++
int main()
można pozostawić bez instrukcji return, w którym to momencie domyślnie zwraca 0. To samo dotyczy programu C99. To, czyreturn 0;
należy je pominąć, czy nie, jest przedmiotem dyskusji. Zakres prawidłowych sygnatur głównych programu C jest znacznie większy.Wydajność nie stanowi problemu z
main
funkcją. Można go wprowadzić i zostawić tylko raz (oznaczając początek i zakończenie programu) zgodnie ze standardem C ++. W przypadku C ponowne wejściemain()
jest dozwolone, ale należy go unikać.źródło
Akceptowana odpowiedź wydaje się być skierowana do C ++, więc pomyślałem, że dodam odpowiedź dotyczącą C, a to różni się na kilka sposobów.
ISO / IEC 9899: 1989 (C90):
main()
należy zadeklarować jako:Lub odpowiednik. Na przykład
int main(int argc, char *argv[])
jest równoważny z drugim. Ponadtoint
typ zwrotu można pominąć, ponieważ jest domyślny.Jeśli implementacja na to pozwala,
main()
może być zadeklarowana na inne sposoby, ale powoduje to, że implementacja programu jest zdefiniowana i nie jest już ściśle zgodna.Norma definiuje 3 wartości do zwracania, które są ściśle zgodne (tzn. Nie polegają na zachowaniu zdefiniowanym w ramach implementacji):
0
orazEXIT_SUCCESS
dla pomyślnego zakończenia iEXIT_FAILURE
nieudanego zakończenia. Wszelkie inne wartości są niestandardowe, a implementacja zdefiniowana. na końcumain()
musi zawierać wyraźnereturn
oświadczenie, aby uniknąć niezdefiniowanego zachowania.Wreszcie ze standardowego punktu widzenia nie ma nic złego w wywoływaniu
main()
z programu.ISO / IEC 9899: 1999 (C99):
W przypadku C99 wszystko jest takie samo jak powyżej, z wyjątkiem:
int
zwrotu nie może zostać pominięty.main()
. Jeśli to zrobisz imain()
skończysz, istnieje domniemaniereturn 0
.źródło
Standard C - środowisko hostowane
W przypadku hostowanego środowiska (to jest normalne) standard C11 (ISO / IEC 9899: 2011) mówi:
Zakończenie programu w C99 lub C11
Zwrócona wartość
main()
jest przekazywana do „środowiska” w sposób zdefiniowany w implementacji.Pamiętaj, że
0
jest to obowiązkowe jako „sukces”. Możesz używaćEXIT_FAILURE
iEXIT_SUCCESS
od<stdlib.h>
jeśli wolisz, ale 0 jest dobrze rozwinięta, a więc jest 1. Patrz także zjazdu kody większa niż 255 - możliwe? .W C89 (i stąd w Microsoft C) nie ma informacji o tym, co się stanie, jeśli
main()
funkcja zwróci, ale nie określi wartości zwracanej; prowadzi to zatem do nieokreślonego zachowania.Standard C ++ - środowisko hostowane
Norma C ++ 11 (ISO / IEC 14882: 2011) mówi:
Standard C ++ wyraźnie mówi: „To [główna funkcja] powinna mieć typ zwracany typu
int
, ale poza tym jego typ jest zdefiniowany w implementacji”, i wymaga tych samych dwóch sygnatur co standard C, aby był obsługiwany jako opcje. Zatem „void main ()” nie jest bezpośrednio dozwolone przez standard C ++, chociaż nic nie może zrobić, aby zatrzymać niestandardową implementację dopuszczającą alternatywy. Zauważ, że C ++ zabrania użytkownikowi dzwonieniamain
(ale standard C nie).W standardzie C ++ 11 znajduje się akapit §18.5 Rozpoczęcie i zakończenie, który jest identyczny z akapitem z § 7.22.4.4 .
exit
Funkcja w standardzie C11 (cytowana powyżej), oprócz przypisu (który po prostu dokumentuje toEXIT_SUCCESS
iEXIT_FAILURE
jest zdefiniowana w<cstdlib>
).Standard C - Wspólne rozszerzenie
Klasycznie systemy Unix obsługują trzeci wariant:
Trzeci argument to zakończona zerem lista wskaźników do ciągów, z których każdy jest zmienną środowiskową, która ma nazwę, znak równości i wartość (być może pustą). Jeśli tego nie użyjesz, nadal możesz dostać się do środowiska poprzez '
extern char **environ;
'. Ta zmienna globalna jest unikalna wśród tych w POSIX, ponieważ nie ma nagłówka, który ją deklaruje.Jest to uznawane przez normę C za wspólne rozszerzenie, udokumentowane w załączniku J:
Microsoft C.
Microsoft VS 2010 kompilator jest interesująca. Strona internetowa mówi:
Nie jest dla mnie jasne, co się dzieje (jaki kod wyjścia jest zwracany do rodzica lub systemu operacyjnego), gdy program ma
void main()
robi wyjście - a strona MS również milczy.Co ciekawe, MS nie zaleca dwuargumentowej wersji
main()
wymaganej przez standardy C i C ++. Określa tylko trzyargumentową formę, w której znajduje się trzeci argumentchar **envp
wskaźnikiem do listy zmiennych środowiskowych.Strona Microsoft wymienia także kilka innych alternatyw -
wmain()
które wymagają szerokich ciągów znaków i kilka innych.Wersja tej strony programu Microsoft Visual Studio 2005 nie jest wymieniona jako alternatywa. W wersjach z Microsoft Visual Studio 2008 r robić.
void main()
Standard C - środowisko wolnostojące
Jak wspomniano wcześniej, powyższe wymagania dotyczą środowisk hostowanych. Jeśli pracujesz w środowisku wolnostojącym (które jest alternatywą dla środowiska hostowanego), standard ma znacznie mniej do powiedzenia. W środowisku wolnostojącym funkcja wywoływana podczas uruchamiania programu nie musi być wywoływana
main
i nie ma żadnych ograniczeń co do typu jej powrotu. Standard mówi:Odniesienie do klauzuli 4 Zgodność odnosi się do tego:
Można zauważyć, że jedynym wymaganym nagłówkiem wolnostojącego środowiska, które faktycznie definiuje dowolne funkcje, jest
<stdarg.h>
(a nawet te mogą - i często są - tylko makra).Standard C ++ - środowisko wolnostojące
Podobnie jak standard C rozpoznaje zarówno środowisko hostowane, jak i wolnostojące, podobnie standard C ++. (Cytaty z ISO / IEC 14882: 2011.)
Co z używaniem
int main()
w C?Norma §5.1.2.2.1 normy C11 pokazuje preferowaną notację -
int main(void)
- ale są też dwa przykłady w normie, które pokazująint main()
: §6.5.3.4 ¶8 i §6.7.6.3 ¶20 . Należy teraz zauważyć, że przykłady nie są „normatywne”; są tylko przykładowe. Jeśli w przykładach występują błędy, nie wpływają one bezpośrednio na główny tekst standardu. To powiedziawszy, mocno wskazują na oczekiwane zachowanie, więc jeśli standard zawieraint main()
w przykładzie, sugeruje, żeint main()
nie jest to zabronione, nawet jeśli nie jest to preferowany zapis.źródło
int main(){ … }
określa, że funkcja nie przyjmuje argumentów, ale nie zapewnia prototypu funkcji AFAICT. Namain()
to rzadko problem; oznacza to, że jeśli masz rekurencyjne wywołaniamain()
, argumenty nie zostaną sprawdzone. W przypadku innych funkcji jest to bardziej problem - naprawdę potrzebujesz prototypu zasięgu, gdy funkcja jest wywoływana, aby upewnić się, że argumenty są poprawne.main()
rekurencyjnie poza miejscami takimi jak IOCCC. Mam program testowy, który to robi - głównie pod kątem nowości. Jeśli maszint i = 0; int main() { if (i++ < 10) main(i, i * i); return 0; }
i kompilujesz za pomocą GCC, a nie zawierasz-Wstrict-prototypes
, kompiluje się czysto pod surowymi ostrzeżeniami. Jeśli takmain(void)
, nie można go skompilować.Uważam, że
main()
powinien wrócić alboEXIT_SUCCESS
alboEXIT_FAILURE
. Są zdefiniowane wstdlib.h
źródło
EXIT_SUCCESS
iEXIT_FAILURE
dlatego, że niektóre historyczne systemy operacyjne (VMS?) Używały innej liczby niż 0 dla oznaczenia sukcesu. Obecnie wszędzie jest 0.exit(EXIT_SUCCESS)
, co zawsze działało poprawnie.Zauważ, że standardy C i C ++ definiują dwa rodzaje implementacji: wolnostojące i hostowane.
Środowisko hostowane w C90
Dozwolone formularze 1 :
Komentarze:
Pierwsze dwa są wyraźnie określone jako dozwolone formy, pozostałe są domyślnie dozwolone, ponieważ C90 dopuszcza „niejawne int” dla typu zwracanego parametru i parametrów funkcji. Żadna inna forma nie jest dozwolona.
Wolnostojące środowisko C90
Dowolna forma lub nazwa magistrali jest dozwolona 2 .
Środowisko hostowane w C99
Dozwolone formularze 3 :
Komentarze:
C99 usunął „niejawne int”, więc
main()
nie jest już ważny.Wprowadzono dziwne, dwuznaczne zdanie „lub w inny sposób określony przez implementację”. Można to interpretować jako „parametry, które
int main()
mogą się różnić” lub jako „main może mieć dowolną formę zdefiniowaną w implementacji”.Niektóre kompilatory wybrały interpretację standardu w ten drugi sposób. Prawdopodobnie nie można łatwo stwierdzić, że nie są one ściśle zgodne z normą, powołując się na samą normę, ponieważ jest ona niejednoznaczna.
Jednak dopuszczenie całkowicie dzikich form
main()
prawdopodobnie nie było (?) Intencją tego nowego zdania. Uzasadnienie C99 (nienormatywne) oznacza, że zdanie odnosi się do dodatkowych parametrów doint main
4 .Jednak sekcja dotycząca zakończenia programu środowiska hostowanego dalej spiera się o przypadek, w którym main nie zwraca int 5 . Chociaż sekcja ta nie jest normatywna w zakresie sposobu deklaracji main, zdecydowanie oznacza, że main może być zadeklarowany w sposób całkowicie zdefiniowany w implementacji, nawet na systemach hostowanych.
C99 wolnostojące środowisko
Dowolna forma lub nazwa magistrali jest dozwolona 6 .
Środowisko hostowane w C11
Dozwolone formularze 7 :
C11 wolnostojące środowisko
Dowolna forma lub nazwa magistrali jest dozwolona 8 .
Należy pamiętać, że
int main()
nigdy nie był wymieniony jako poprawny formularz dla hostowanej implementacji języka C w żadnej z powyższych wersji. W C, w przeciwieństwie do C ++()
i(void)
mają różne znaczenia. Ten pierwszy jest przestarzałą funkcją, którą można usunąć z języka. Zobacz przyszłe kierunki języka C11:Środowisko hostowane w C ++ 03
Dozwolone formularze 9 :
Komentarze:
Zwróć uwagę na pusty nawias w pierwszej formie. C ++ i C różnią się w tym przypadku, ponieważ w C ++ oznacza to, że funkcja nie przyjmuje parametrów. Ale w C oznacza, że może przyjąć dowolny parametr.
C ++ 03 środowisko wolnostojące
Nazwa funkcji wywoływanej podczas uruchamiania jest zdefiniowana w implementacji. Jeśli jest nazwany
main()
, musi spełniać podane formularze 10 :Środowisko hostowane w C ++ 11
Dozwolone formularze 11 :
Komentarze:
Tekst standardu został zmieniony, ale ma to samo znaczenie.
Wolnostojące środowisko C ++ 11
Nazwa funkcji wywoływanej podczas uruchamiania jest zdefiniowana w implementacji. Jeśli jest nazwany
main()
, musi spełniać podane formularze 12 :Bibliografia
ANSI X3.159-1989 2.1.2.2 Środowisko hostowane. „Uruchomienie programu”
ANSI X3.159-1989 2.1.2.1 Środowisko wolnostojące:
ISO 9899: 1999 5.1.2.2 Środowisko hostowane -> 5.1.2.2.1 Uruchomienie programu
Uzasadnienie międzynarodowego standardu - języki programowania - C, wersja 5.10. 5.1.2.2 Środowisko hostowane -> 5.1.2.2.1 Uruchomienie programu
ISO 9899: 1999 5.1.2.2 Środowisko hostowane -> 5.1.2.2.3 Zakończenie programu
ISO 9899: 1999 5.1.2.1 Środowisko wolnostojące
ISO 9899: 2011 5.1.2.2 Środowisko hostowane -> 5.1.2.2.1 Uruchomienie programu
Ta sekcja jest identyczna z cytowaną powyżej C99.
ISO 9899: 1999 5.1.2.1 Środowisko wolnostojące
Ta sekcja jest identyczna z cytowaną powyżej C99.
ISO 14882: 2003 3.6.1 Główna funkcja
ISO 14882: 2003 3.6.1 Główna funkcja
ISO 14882: 2011 3.6.1 Główna funkcja
ISO 14882: 2011 3.6.1 Główna funkcja
Ta sekcja jest identyczna z C ++ 03 cytowaną powyżej.
źródło
int my_startup_function ()
lub czyint my_startup_function (int argc, char *argv[])
może ona mieć na przykład:char my_startup_function (long argc, int *argv[])
jako funkcję uruchamiania? Chyba nie, prawda? Czy to również nie jest dwuznaczne?main()
ponieważ wtedy musi użyć jednego z wymienionych podpisów. Wyobrażam sobie, że najbardziej powszechny byłbyvoid my_startup_function ()
, ponieważ nie ma sensu wracać z programu na wolnostojące systemy.main
? Przepraszam, jeśli to nie jest mądre pytanie, ale nie mogłem zrozumieć uzasadnienia.func()
uważa się go za przestarzały, sam szkic używaint main()
w swoich własnych przykładach.Zwraca 0 w przypadku sukcesu i niezerową w przypadku błędu. Jest to standard używany przez skrypty UNIX i DOS, aby dowiedzieć się, co się stało z twoim programem.
źródło
main()
w C89 i K&R C nieokreślone typy zwracane są domyślnie na „int”.Jeśli nie napiszesz instrukcji return
int main()
, zamknięcie{
zwróci domyślnie 0.return 0
lubreturn 1
zostanie odebrany przez proces nadrzędny. W powłoce przechodzi w zmienną powłoki, a jeśli program jest tworzony z powłoki i nie używasz tej zmiennej, nie musisz się martwić o wartość zwracanąmain()
.Zobacz Jak mogę uzyskać to, co zwróciła moja główna funkcja? .
W ten sposób możesz zobaczyć, że to zmienna
$?
otrzymuje najmniej znaczący bajt wartości zwracanejmain()
.W skryptach Unix i DOS
return 0
zwykle zwracane są informacje o powodzeniu i niezerowej wartości błędu. Jest to standard używany przez skrypty Unix i DOS, aby dowiedzieć się, co się stało z twoim programem i kontrolować cały przepływ.źródło
$?
nie jest zmienną środowiskową; jest to wstępnie zdefiniowana (lub wbudowana) zmienna powłoki. Różnica jest trudna do zauważenia, ale jeśli uruchomiszenv
(bez żadnych argumentów), wydrukuje środowisko i$?
nie będzie widoczne w środowisku.{
powinno być „zamykanie ”}
. SO nie pozwoli mi więc na tak małą edycję.Pamiętaj, że nawet jeśli zwracasz liczbę całkowitą, niektóre systemy operacyjne (Windows) skracają zwracaną wartość do jednego bajtu (0–255).
źródło
unsigned
). To samo dotyczy systemów UNIX z 32-bitowymi liczbami całkowitymi. Ale powłoki w stylu UNIX w każdym systemie zwykle zachowują tylko 8-bitową liczbę całkowitą bez znaku.Wartość zwracana może być wykorzystana przez system operacyjny do sprawdzenia, jak program został zamknięty.
Zwracana wartość 0 zwykle oznacza OK w większości systemów operacyjnych (tych, o których i tak myślę).
Można to również sprawdzić podczas samodzielnego wywołania procesu i sprawdzić, czy program został poprawnie zakończony i zakończony.
To NIE jest tylko konwencja programowania.
źródło
Zwracana wartość
main()
pokazuje sposób wyjścia z programu. Jeśli zwracana jest wartośćzero
, oznacza to, że wykonanie zakończyło się powodzeniem, a każda niezerowa wartość będzie oznaczać, że coś poszło nie tak.źródło
Miałem wrażenie, że standard określa, że main nie potrzebuje wartości zwracanej, ponieważ pomyślny zwrot był oparty na systemie operacyjnym (zero w jednym może być sukcesem lub porażką w innym), dlatego brak zwrotu był wskazówką dla kompilator do wstawienia samego pomyślnego zwrotu.
Jednak zwykle zwracam 0.
źródło
Zwrócenie 0 powinno poinformować programistę, że program pomyślnie zakończył zadanie.
źródło
main()
normalnie sygnalizuje wystąpienie błędu; zwracanie 0 oznacza sukces. Jeśli twoje programy zawsze zawodzą, to 1 jest w porządku, ale nie jest to najlepszy pomysł.1
zmain
jest zdefiniowane w implementacji. Wartości tylko język zdefiniowane są0
,EXIT_SUCCESS
(często definiowane jako0
), aEXIT_FAILURE
. W OpenVMSreturn 1;
oznacza pomyślne zakończenie.Pomijać
return 0
Gdy program C lub C ++ osiągnie koniec
main
kompilatora, automatycznie wygeneruje kod zwracający 0, więc nie ma potrzebyreturn 0;
jawnego umieszczania go na końcumain
.Uwaga: kiedy piszę tę sugestię, prawie zawsze następuje jeden z dwóch rodzajów komentarzy: „Nie wiedziałem o tym”. lub „To zła rada!” Moje uzasadnienie jest takie, że bezpieczne i użyteczne jest poleganie na zachowaniu kompilatora wyraźnie obsługiwanym przez standard. Dla C, od C99; patrz ISO / IEC 9899: 1999 sekcja 5.1.2.2.3:
Dla C ++ od pierwszego standardu w 1998 r .; patrz ISO / IEC 14882: 1998 sekcja 3.6.1:
Wszystkie wersje obu standardów od tego czasu (C99 i C ++ 98) utrzymały ten sam pomysł. Opieramy się na automatycznie generowanych funkcjach członkowskich w C ++, a niewiele osób pisze wyraźne
return;
instrukcje na końcuvoid
funkcji. Powody, dla których zaniechanie wydaje się sprowadzać do „wygląda dziwnie” . Jeśli, podobnie jak ja, jesteś ciekaw uzasadnienia zmiany standardu C, przeczytaj to pytanie . Zauważ też, że na początku lat 90. było to uważane za „niechlujną praktykę”, ponieważ było to wówczas zachowanie nieokreślone (choć powszechnie wspierane).Ponadto Wytyczne podstawowe C ++ zawierają wiele instancji pomijania
return 0;
na końcumain
i żadnych instancji, w których zapisany jest wyraźny zwrot. Chociaż w tym dokumencie nie ma jeszcze szczegółowych wytycznych na ten konkretny temat, wydaje się to przynajmniej milczącym poparciem dla tej praktyki.Dlatego zalecam pominięcie tego; inni się nie zgadzają (często gwałtownie!) W każdym razie, jeśli napotkasz kod, który go pomija, będziesz wiedział, że jest on wyraźnie obsługiwany przez standard i będziesz wiedział, co to znaczy.
źródło
return 0;
, jednak chciałbym zauważyć, że wiele kompilatorów z tej epoki również wdrożyło domniemane,return 0;
jeszcze zanim było znormalizowany.return 0
przez ponad dekadę. Również obecne wersje Microsoft C wspierać je jako dobrze . Być może Twoje informacje są nieaktualne?Co należy zwrócić, zależy od tego, co chcesz zrobić z plikiem wykonywalnym. Na przykład, jeśli używasz swojego programu z powłoką wiersza poleceń, musisz zwrócić 0 dla sukcesu i niezerowe dla niepowodzenia. Wtedy będziesz mógł używać programu w powłokach z przetwarzaniem warunkowym w zależności od wyniku twojego kodu. Można również przypisać dowolną wartość niezerową zgodnie z interpretacją, na przykład w przypadku błędów krytycznych różne punkty wyjścia programu mogą zakończyć program z różnymi wartościami wyjścia i który jest dostępny dla powłoki wywołującej, która może zdecydować, co zrobić, sprawdzając zwróconą wartość. Jeśli kod nie jest przeznaczony do używania z powłokami, a zwrócona wartość nikomu nie przeszkadza, można go pominąć. Ja osobiście używam podpisu
int main (void) { .. return 0; .. }
źródło
main
jest zgodnyint
. Dlatego powrótint
nie będzie problemem. Chociaż dozwolone są inne typy zwracane, ale w takim przypadku zmienna środowiskowa o wartości zwracanej nie będzie określona. Ale jeśli programista to zrobi,return 0;
wtedy w bashu można go użyć do tworzenia gałęzi.Jeśli naprawdę masz problemy związane z wydajnością zwracania liczby całkowitej z procesu, prawdopodobnie powinieneś unikać wywoływania tego procesu tyle razy, że ta zwracana wartość staje się problemem.
Jeśli to robisz (wywołujesz proces wiele razy), powinieneś znaleźć sposób na umieszczenie logiki bezpośrednio w dzwoniącym lub w pliku DLL, bez przydzielania określonego procesu dla każdego połączenia; przydziały wielu procesów przynoszą w tym przypadku odpowiedni problem z wydajnością.
Szczegółowo, jeśli chcesz tylko wiedzieć, czy zwracanie 0 jest mniej lub bardziej wydajne niż zwracanie 1, w niektórych przypadkach może zależeć od kompilatora, ale ogólnie, zakładając, że są one odczytywane z tego samego źródła (lokalnego, pola, stałego, osadzonego w kodzie, wyniku funkcji itp.) wymaga dokładnie takiej samej liczby cykli zegara.
źródło
Oto mała demonstracja użycia kodów powrotu ...
Korzystając z różnych narzędzi udostępnianych przez terminal Linuksa, można użyć kodu powrotu na przykład do obsługi błędów po zakończeniu procesu. Wyobraź sobie, że obecny jest następujący plik tekstowy mój plik:
Po wykonaniu polecenia grep tworzony jest proces. Po przejściu (i nie zepsuciu) zwraca kod między 0 a 255. Na przykład:
Jeśli zrobisz
dostaniesz 0. Dlaczego? Ponieważ grep znalazł dopasowanie i zwrócił kod wyjścia 0, co jest zwykle wartością kończącą się sukcesem. Sprawdźmy to jeszcze raz, ale z czymś, co nie znajduje się w naszym pliku tekstowym, a zatem nie zostanie znalezione dopasowanie:
Ponieważ grep nie dopasował tokena „foo” do zawartości naszego pliku, kod powrotu to 1 (jest to zwykły przypadek, gdy wystąpi awaria, ale jak wspomniano powyżej, masz wiele wartości do wyboru).
Teraz poniższy skrypt bash (wystarczy wpisać go w terminalu Linux), chociaż bardzo podstawowy powinien dać pojęcie o obsłudze błędów:
Po drugim wierszu nic nie jest drukowane na terminalu, ponieważ „foo” powoduje, że grep zwraca 1, a my sprawdzamy, czy kod powrotu grep był równy 0. Druga instrukcja warunkowa powtarza swój komunikat w ostatnim wierszu, ponieważ jest to prawdą z powodu SPRAWDŹ == 1.
Jak widać, jeśli wywołujesz ten i ten proces, czasami niezbędne jest sprawdzenie, co zostało zwrócone (według wartości zwracanej przez main ()).
źródło
if grep foo myfile; then echo 'Match found'; else echo 'No match was found'; fi
- bezpośrednio testując status zwrotu. Jeśli chcesz uchwycić status (do raportowania itp.), Skorzystaj z zadania. Możesz użyćif grep foo myfile; CHECK=$?; [ "$CHECK" = 0 ]; then echo 'Match found'; else echo 'No match was found'; fi
lub możesz użyć trzech linii. Możesz także użyć opcji-s
i,-q
abygrep
zapobiec wyświetlaniu dopasowań lub rutynowych komunikatów o błędach. Jest to jednak drobiazg powłoki - kluczowym punktem, w którym status wyjścia może być przydatny - jest OK.Te słowa „(najbardziej wydajny)” nie zmieniają pytania. O ile nie znajdujesz się w wolnostojącym środowisku, istnieje jeden ogólnie poprawny sposób deklarowania
main()
, i to jako zwrot int.To nie to, co powinien
main()
wrócić, to co robimain()
zwrot.main()
jest oczywiście funkcją, którą wywołuje ktoś inny. Nie masz żadnej kontroli nad wywoływanym kodemmain()
. Dlatego musisz zadeklarowaćmain()
z poprawnym typem podpisu, aby pasował do dzwoniącego. Po prostu nie masz wyboru w tej sprawie. Nie musisz zadawać sobie pytania, co jest bardziej lub mniej wydajne, czy jest lepszy, czy gorszy styl, czy coś w tym rodzaju, ponieważ odpowiedź jest już dla Ciebie doskonale zdefiniowana przez standardy C i C +. Po prostu podążaj za nimi.0 dla sukcesu, niezerowe dla niepowodzenia. Ponownie, nie jest to coś, co musisz (lub trzeba) wybrać: jest to zdefiniowane przez interfejs, z którym powinieneś być zgodny.
źródło