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ę?
Author: Federico Baù, 2010-11-17

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.

 196
Author: James McNellis,
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[]) { / ... / }

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 .....

Mam nadzieję, że to pomoże..
 15
Author: liaK,
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ąca int i

  • Funkcja (int, pointer to pointer to char) zwracająca int

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)
 4
Author: M.M,
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.

 3
Author: stonemetal,
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 funkcji main (zniszczenie obiektów o automatycznym czasie przechowywania) i wywołanie std::exit z wartością zwracaną jako argumentem. Jeśli sterowanie osiągnie koniec main bez napotkania instrukcji return, efektem jest wykonanie

return 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 to EXIT_FAILURE, zwracana jest zdefiniowana przez implementację forma nieudanego zakończenia statusu. W przeciwnym razie zwracany status jest zdefiniowany w implementacji.

 2
Author: Ben Voigt,
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