Jaka jest poprawna sygnatura main
funkcji w C ++? Jaki jest prawidłowy typ zwracanej wartości i co to znaczy zwracać wartość main
? Jakie są dozwolone typy parametrów i jakie mają znaczenie?
Czy to jest specyficzne dla systemu? Czy te zasady zmieniały się z czasem? Co się stanie, jeśli je naruszę?
main
zwrócone w C i C ++ , lub jest jego duplikatem .Odpowiedzi:
main
Funkcja musi być zadeklarowany jako funkcja trzecich w globalnej przestrzeni nazw. Oznacza to, że nie może to być statyczna lub niestatyczna funkcja składowa klasy, ani nie może być umieszczona w przestrzeni nazw (nawet w nienazwanej przestrzeni nazw).Nazwa
main
nie jest zarezerwowana w C ++ z wyjątkiem funkcji w globalnej przestrzeni nazw. Możesz zadeklarować inne wymienione podmiotymain
, w tym między innymi klasy, zmienne, wyliczenia, funkcje składowe i funkcje niebędące członkami, które nie znajdują się w globalnej przestrzeni nazw.Można zadeklarować funkcję nazwaną
main
jako funkcja składowa lub w przestrzeni nazw, ale taka funkcja nie byłabymain
funkcją wyznaczającą miejsce rozpoczęcia programu.main
Funkcja nie może być uznana jakostatic
lubinline
. Nie można go również przeciążać;main
w globalnej przestrzeni nazw może istnieć tylko jedna funkcja .main
Funkcja nie może być używana w programie: nie wolno wywołaćmain
funkcję z dowolnego miejsca w kodzie, ani ty mogą brać swój adres.Zwracany typ
main
musi byćint
. Żaden inny typ zwracania nie jest dozwolony (ta reguła jest pogrubiona, ponieważ bardzo często można zobaczyć niepoprawne programy, które deklarująmain
zwracany typvoid
; jest to prawdopodobnie najczęściej naruszana reguła dotyczącamain
funkcji).Istnieją dwie deklaracje tego,
main
co musi być dozwolone:W (1) nie ma parametrów.
W (2) są dwa parametry i są one umownie nazwane
argc
iargv
, odpowiednio.argv
jest wskaźnikiem do tablicy ciągów C reprezentujących argumenty programu.argc
to liczba argumentów wargv
tablicy.Zwykle
argv[0]
zawiera nazwę programu, ale nie zawsze tak jest.argv[argc]
na pewno jest pustym wskaźnikiem.Zauważ, że ponieważ argument typu tablicowego (jak
char*[]
) jest w rzeczywistości tylko argumentem typu wskaźnika w przebraniu, poniższe dwa są poprawnymi sposobami zapisu (2) i oba oznaczają dokładnie to samo:Niektóre implementacje mogą dopuszczać inne typy i liczby parametrów; musiałbyś sprawdzić dokumentację swojej implementacji, aby zobaczyć, co obsługuje.
main()
oczekuje, że zwróci zero, aby wskazać sukces i niezerowe, aby wskazać błąd. Nie musisz jawnie pisaćreturn
instrukcji wmain()
: jeśli pozwalasz namain()
powrót bez wyraźnegoreturn
oświadczenia, jest to tak samo, jak gdybyś to napisałreturn 0;
. Następujące dwiemain()
funkcje mają takie samo zachowanie:Istnieją dwa makra,
EXIT_SUCCESS
aEXIT_FAILURE
zdefiniowane w nich<cstdlib>
mogą być również zwracane zmain()
aby wskazać odpowiednio sukces i niepowodzenie.Wartość zwracana przez
main()
jest przekazywana doexit()
funkcji, która kończy działanie programu.Zauważ, że wszystko to dotyczy tylko kompilacji dla środowiska hostowanego (nieformalnie, środowiska, w którym masz pełną bibliotekę standardową i system operacyjny, na którym działa twój program). Możliwe jest również skompilowanie programu w C ++ dla środowiska wolnostojącego (na przykład niektórych typów systemów wbudowanych), w którym to przypadku uruchomienie i zakończenie są całkowicie zdefiniowane przez implementację, a
main()
funkcja może nawet nie być wymagana. Jeśli jednak piszesz C ++ dla nowoczesnego systemu operacyjnego dla komputerów stacjonarnych, kompilujesz dla środowiska hostowanego.źródło
Main
być statyczną funkcją składową, ponieważ nie ma nawet funkcji niebędących członkami. Nawet C89 wymagamain
powrotuint
. Nie jestem wystarczająco zaznajomiony z K&R C, aby poznać jego dokładne reguły, ale myślę, że wymaga równieżmain
powrotu,int
ponieważmain
bez zwracanego typu był dość powszechny i brak type = implicitint
w K&R.int
.void
zwracany typ jako rozszerzenie języka . Kompilatory, które na to nie pozwalają, obejmują GCC i Comeau.Z dokumentacji standardowej, 3.6.1.2 Główna funkcja ,
int main() { / ... / }
iint main(int argc, char* argv[]) { / ... / }
Mam nadzieję, że to pomoże ...
źródło
main
powinien być zwracany typint
?void
zrywa ten model. To nawet nie ma sensu, gdybyś miał na myśli „zawsze uważaj za sukces”. Ponieważ nie można było powiedzieć, czy proces się nie powiódł, więc czy naprawdę się udało? Nie, wróćint
.Dokładne brzmienie najnowszego opublikowanego standardu (C ++ 14) to:
To wyjaśnia, że alternatywne pisownie są dozwolone, o ile typem
main
jest typint()
lubint(int, char**)
. Zatem dozwolone są również:int main(void)
auto main() -> int
int main ( )
signed int main()
typedef char **a; typedef int b, e; e main(b d, a c)
źródło
int main(void)
nie był poprawny w C ++.auto main() -> int
nie ma wydedukowanego typu zwrotu. Zwróć uwagę na {in "(auto main () {... is not allowed)" i dowiedz się, kiedy nie wiesz jeszcze wystarczająco dużo, aby dodać cokolwiek sensownego.Dwie ważne sieci to
int main()
iint main(int, char*[])
. Każda inna rzecz może się skompilować lub nie. Jeślimain
nie zwraca jawnie wartości, niejawnie zwracane jest 0 .źródło
main
który ma być void. Czy jest jakiś konkretny powód, dla którego typem zwracanym main powinien być int?int
jako zwracanego typumain
jest to, że ta wartość jest przekazywana powłoce jako kod zakończenia programu ish
oczekujeint
.void
, wszystkie są ciche. Z tymint
musimy zdefiniować konkretną wartość wyjścia dla każdego powrotu zmain
.Szczegóły dotyczące zwracanych wartości i ich znaczenia
Na 3.6.1 (
[basic.start.main]
):Zachowanie
std::exit
jest szczegółowo opisane w sekcji 18.5 ([support.start.term]
) i opisuje kod stanu:źródło