Jaka jest właściwa deklaracja main w C++?
Pytania
-
Jaka jest prawidłowa sygnatura funkcji
main
W C++? -
Jaki jest prawidłowy typ zwracania i co oznacza zwracanie wartości z
main
? -
Jakie są dozwolone typy parametrów i jakie są ich znaczenia?
- Czy ten system jest specyficzny?
-
Czy te zasady zmieniły się w czasie?
- Co się stanie, jeśli je naruszę?
5 answers
Funkcja main
musi być zadeklarowana jako funkcja nieczłonkowa w globalnej przestrzeni nazw. Oznacza to, że nie może być statyczną lub niestatyczną funkcją klasy, ani nie może być umieszczona w przestrzeni nazw (nawet nienazwanej przestrzeni nazw).
Nazwa main
nie jest zarezerwowana w C++ z wyjątkiem funkcji w globalnej przestrzeni nazw. Możesz dowolnie deklarować inne encje o nazwie main
, w tym między innymi klasy, zmienne, wyliczenia, funkcje member i non-member funkcje spoza globalnej przestrzeni nazw.
Możesz zadeklarować funkcję o nazwie main
jako funkcję członkowską lub w przestrzeni nazw, ale taka funkcja nie byłaby funkcją main
, która wyznacza miejsce startu programu.
Funkcja main
nie może być zadeklarowana jako static
lub inline
. Nie można jej również przeciążyć; w globalnej przestrzeni nazw może być tylko jedna funkcja o nazwie main
.
Funkcja main
nie może być używana w twoim programie: nie możesz wywoływać main
funkcja z dowolnego miejsca w kodzie, ani nie można wziąć jego adres.
Zwracany typ main
musi być int
. Żaden inny typ zwracania nie jest dozwolony (ta reguła jest pogrubiona, ponieważ bardzo często widzi się nieprawidłowe programy deklarujące main
z typem zwracającym void
; jest to prawdopodobnie najczęściej łamana reguła dotycząca funkcji main
).
Istnieją dwie deklaracje main
, które muszą być dozwolone:
int main() // (1)
int main(int, char*[]) // (2)
W (1), nie ma żadnych parametrów.
W (2), istnieją dwa parametry i są one odpowiednio nazwane argc
i argv
. argv
jest wskaźnikiem do tablicy łańcuchów C reprezentujących argumenty programu. argc
jest liczbą argumentów w tablicy argv
.
Zazwyczaj argv[0]
zawiera nazwę programu, ale nie zawsze tak jest. argv[argc]
jest gwarantowany jako wskaźnik null.
Zauważ, że ponieważ argument typu array (jak char*[]
) jest tak naprawdę tylko argumentem typu wskaźnik w ukryciu, następujące dwa są poprawnymi sposobami zapisu (2) i oba znaczą dokładnie to samo: {]}
int main(int argc, char* argv[])
int main(int argc, char** argv)
Niektóre implementacje mogą zezwalać na inne typy i liczby parametrów; musisz sprawdzić dokumentację swojej implementacji, aby zobaczyć, co ona obsługuje.
main()
oczekuje się, że zwróci zero, aby wskazać sukces i niezer, aby wskazać porażkę. Nie musisz wyraźnie pisać return
wyrażenie w main()
: jeśli pozwolisz main()
powrócić bez wyraźnego wyrażenia return
, będzie to takie samo, jak gdybyś napisał return 0;
. Następujące dwie funkcje main()
mają takie samo zachowanie:
int main() { }
int main() { return 0; }
Istnieją dwa makra, EXIT_SUCCESS
i EXIT_FAILURE
, zdefiniowane w <cstdlib>
, które mogą być również zwracane z main()
, aby odpowiednio wskazać sukces i porażkę.
Wartość zwracana przez {[28] } jest przekazywana do funkcji exit()
, 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ą standardową bibliotekę i system operacyjny z Twoim programem). Możliwe jest również skompilowanie programu C++ Dla środowiska wolnostojącego (na przykład niektóre typy systemów wbudowanych), w którym to przypadku uruchomienie i zakończenie są całkowicie zdefiniowane przez implementację, a funkcja main()
może nawet nie być wymagana. Jeśli piszesz C++ dla nowoczesnego systemu operacyjnego, kompilujesz dla hostowanego środowisko.
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-11-23 18:24:18
Ze standardowych dokumentów., 3.6.1.2 Funkcja Główna ,
Będzie miał zwrot Typ typu int, ale poza tym jego typ jest zdefiniowany w implementacji. Wszystkie implementacje powinny umożliwiać zarówno następujące definicje głównego:
int main() { / ... / }
oraz
int main(int argc, char* argv[]) { / ... / }
Mam nadzieję, że to pomoże..W tej ostatniej formie
argc
jest liczbą argumentów przekazywanych do programu ze środowiska, w którym program jest uruchomiony.Jeśli argc jest niezerowe , argumenty te podaje się w argv [0] poprzez argv[argc-1] jako wskaźniki do początkowe znaki łańcuchów wielobajtowych zakończonych znakiem null .....
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
2010-11-18 05:21:18
Dokładne sformułowanie najnowszego opublikowanego standardu (C++14) to:
Implementacja umożliwia zarówno
Funkcja
()
zwracającaint
iFunkcja
(int
, pointer to pointer tochar)
zwracającaint
Jako typ
main
.
To wyjaśnia, że alternatywne pisownie są dozwolone tak długo, jak typ main
jest typem int()
lub int(int, char**)
. Oto więc dozwolone 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)
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
2017-07-01 09:22:40
Dwie ważne sieci to int main()
i int main(int, char*[])
. Każda inna rzecz może lub nie może się skompilować. Jeśli main
nie zwraca jawnie wartości, 0 jest zwracane domyślnie.
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
2018-03-23 15:31:07
Szczegóły dotyczące wartości zwrotnych i ich znaczenia
Per 3.6.1 ([basic.start.main]
):
Instrukcja return w
main
powoduje opuszczenie funkcjimain
(zniszczenie obiektów o automatycznym czasie przechowywania) i wywołaniestd::exit
z wartością zwracaną jako argumentem. Jeśli sterowanie osiągnie koniecmain
bez napotkania instrukcjireturn
, efektem jest wykonaniereturn 0;
Zachowanie std::exit
jest wyszczególnione w sekcji 18.5 ([support.start.term]
) oraz opis kodu stanu:
Na koniec kontrola jest zwracana do środowiska hosta. Jeśli status jest równy zero lub
EXIT_SUCCESS
, zwracana jest zdefiniowana przez implementację forma zakończenia statusu pomyślnego. Jeśli status toEXIT_FAILURE
, zwracana jest zdefiniowana przez implementację forma nieudanego zakończenia statusu. W przeciwnym razie zwracany status jest zdefiniowany w implementacji.
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-06-20 09:12:55