Czy main() jest przeciążony w C++?

Istnieją 2 ważne wersje main() w C++:

int main()  // version 1
int main(int argc, char **argv)  // version 2

Ale oba przeciążenia nie mogą współistnieć w tym samym czasie. Dlaczego nie? (Potencjalny przypadek użycia: podczas uruchamiania programu z terminala, jeśli nie zostaną przekazane żadne argumenty, wywoływana jest pierwsza wersja, w przeciwnym razie druga.)

Czy kompilator wykonuje specjalne sprawdzenie, aby zezwolić tylko na jedną wersję na binarny?

Author: James Ko, 2011-06-20

6 answers

§3.6.1/2 (C++03) mówi

Implementacja nie powinna być predefiniowana funkcja main. Funkcja ta powinna nie być przeciążonym. ma zwraca typ typu int, ale w przeciwnym razie jego typ jest zdefiniowany w implementacji. Wszystkie implementacje umożliwiają zarówno z następujących definicji main:

   int main() { /* ... */ }
   int main(int argc, char* argv[]) { /* ... */ }
Możesz użyć jednego z nich. Oba są zgodne ze standardem.

Również, ponieważ char *argv[] jest równoważne char **argv, zastępując char *argv[] przez To bez różnicy.


Ale obie wersje nie mogą współistnieć w tym samym czasie ! (przypadek użycia może być następujący: podczas uruchamiania programu binarnego z wiersza polecenia, jeśli nie podasz żadnego argumentu, to pierwsza wersja powinna być wywołana inaczej druga wersja).

Nie. Obie wersje nie mogą współistnieć jednocześnie. JEDEN program może mieć dokładnie jedną funkcję main. Który z nich, zależy od Twojego wyboru. Jeśli chcesz przetworzyć argument wiersza poleceń, musisz wybrać druga wersja, albo pierwsza wersja wystarczy. Zauważ również, że jeśli używasz drugiej wersji i nie przekazujesz żadnego argumentu wiersza poleceń, to nie ma w tym nic złego. Nie spowoduje to żadnego błędu. Musisz tylko odpowiednio zinterpretować argc i argv, i na podstawie ich wartości, musisz napisać logikę i przepływ swojego programu.
 64
Author: Nawaz,
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
2011-07-28 23:52:48

Windows i Unix mają:

int main(int argc, char **argv, char **envp)

I aplikacje Win32 mają:

int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

A MacOS ma:

int main(int argc, char **argv, char **envp, char **apple)

Nie zapominaj, że main zwykle nie jest pierwszą rzeczą, którą wywołuje system operacyjny podczas wykonywania programu. Funkcja {[3] } jest funkcją, która jest wywoływana przez środowisko run time. Adres pierwszej instrukcji do wykonania jest zwykle deklarowany w niektórych metadanych, zwykle na początku pliku wykonywalnego.

Żadne z powyższych nie stoi w sprzeczności ze standardem C / C++ O ile I można powiedzieć, tak długo, jak jest tylko jeden, co ma sens, ponieważ system operacyjny nie wiedziałby, który zadzwonić, gdyby było więcej niż jeden. Sprawdzenie, czy jest tylko jeden, nie jest wykonywane w kompilatorze, jest wykonywane w linkerze.

 20
Author: Skizz,
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
2011-06-20 08:02:29

Sekcja 3.6.1.2 W obu wersjach C++ Standard 1998 i 2003 stwierdza:

Implementacja nie predefiniuje funkcji głównej. Funkcja ta nie może być przeciążona . Ma typ zwracany typu int, ale poza tym jego typ jest zdefiniowany w implementacji.

Dalej,

Norma ISO C++ (ISO/IEC 14882:1998) wymaga, aby main zwrócił int. Ma wyraźne ograniczenie "powinien" na dobrze uformowanych programach.

Sekcja § 3.6.1 ¶ 2:

Powinien mieć typ zwracający int, ale poza tym jego typ jest zdefiniowany w implementacji. Wszystkie implementacje dopuszczają obie z następujących definicji main:

int main() { /* … */ }

I

int main(int argc, char* argv[]) { /* … */ }

Tak więc obie wersje main są dozwolone przez standard, A która z nich jest używana jest preferowana przez programistę.

 13
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
2011-09-16 09:10:52

Main został zdefiniowany w czasach C. Jest ustawiony bardziej zgodnie z zasadami printf. Rozważmy main jako funkcję varadialną:

int main(...)

Standard mówi, że żadne argumenty i dwa argumenty wskaźnikowe nie są w porządku. Jeśli jednak implementacja chce dostarczyć więcej argumentów, może to zrobić.

Powód, dla którego nie możesz mieć dwóch main S, jest tym samym powodem, dla którego nie możesz dwukrotnie zdefiniować printf funkcji podobnej w programie C. Oczywiście, printf wspiera różne argumenty i zmiany jest to zachowanie zależne od tego, które argumenty są tam, ale nie jest przeciążenie w sensie C++ tego terminu.

 9
Author: Billy ONeal,
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
2011-06-20 08:13:12

Standard mówi, że main nie może być przeciążony. Nie jest zniekształcony i nie możesz mieć dwóch funkcji o tej samej niezmieszanej nazwie. Spowoduje to błąd łączenia, ale kompilator może chcieć dodać jawne kontrole w celu uzyskania jaśniejszych komunikatów o błędach.

int main(int argc, char **argv) i int main() powinny być preferowanymi podpisami, ale Kompilatory mogą swobodnie akceptować main z różnymi parametrami.

 7
Author: peoro,
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
2011-06-20 07:49:53

Nie jest możliwe przeciążenie main() w C++, ponieważ. kompilator pokazał następujący błąd:

error C2731: 'main' : function cannot be overloaded 
 0
Author: Dheeraj Bansal,
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
2011-07-28 14:16:38