Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ C / C++ (ANSI-Standard) » main - Aufzucht und Pflege

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.08.2002, 22:11 Uhr
virtual
Sexiest Bit alive
(Operator)


main
Ein häufig gestellt Frage ist, welche Form von main denn nun die richtige sei und welche denn falsch sind. Dieser Artikel versucht diese Frage zu beantworten und einige Zusatzinformationen zu lieferen.

Die erlaubten Formen von main
Gemäß C Standard (ISO/IEC9899:1999, Abschnitt 5.1.2.2.1) bzw. C++ Standard (ISO/IEC 14882, Abschnitt 3.6.1) sind nur zwei Deklarationen von main standardisiert und portabel:

C++:
int main()


sowie

C++:
int main(int argc, char* argv[]) // äquivalent für argv ist: char** argv


Ein C/C++ Compiler kann zwar auf die Idee kommen, auch andere Deklarationen von main zu unterstützen, aber grundsätzlich sind nur die beiden obigen standardisiert.

Welchen Sinn hat der Rückgabewert von main?
Zwar ist es ja ganz nett, daß der Standard sagt, daß main ein int zurückgeben soll, aber die Frage ist, warum?
Die Antwort: mit Hilfe des Rückgabewertes kann main (und damit das gesamte Programm) dem Aufrufer signalisieren, ob das Programm normal durchgelaufen ist, oder einen Fehler produziert hat. So kann man unter UNIX mit hilfe der Shellvariablen $? den Rückgabewert eines Programms abfragen; bei Windows gibt es eine etwas verkrüppelte Alternative durch Abfragen des Errorlevels.
Gemäß Standard gibt ein Programm im Normalfall 0 zurück, im Fehlerfall einen Wert ungleich 0. (Im Header stdlib.h bzw. cstdlib findet man entsprechende Konstanten für die Rückgabe, nämlich EXIT_SUCCESS und EXIT_FAILURE, die kann man auch verwenden.)
Der Standard sagt weiterhin, daß, wenn man das return "vergessen" hat, ein return 0 angenommen/automatisch ergänzt wird (ein Umstand, dem manche Compiler nicht Rechnung tragen und dennoch warnen).

Und was soll das mit den Parametern?
Wie gezeigt, kann man main entweder keine, oder aber direkt zwei Parameter mit liefern. Bei der Version mit den zwei Parametern kann man die Argumente, die dem Programm mit geliefert wurden, abfragen.
Dabei enhält argc die Anzahl der Argumente plus 1. D.h. ruft man das Programm ohne weitere Argumente auf, dann enthält argc eine 1, für jedes (weitere) Argument wird argc um eins erhöht.
Die Argumente selbst befinden sich in argv. Das ist ein Array von C-Strings, wobei argv[0] den Namen des Programms (so wie es aufgerufen wurde) enthält und argv[1] das erste Argument (wenn denn eines da ist). Ausserdem ist garantiert, dass argv[argc] immer NULL ist.

Häufige Fehldeklarationen von main
Ich möchte noch kurz auf drei häufige fehlerhafte Deklarationen von main eingehen:

C++:
void main(...)


Wird ganz gerne von Anfängern gemacht. Fortgeschrittene Programmierer regen sich ganz gerne darüber auf und teilen dem Anfänger mit, daß das Programm wegen dieser Deklaration so grottenschlecht sei, daß man es getrost in der Pfeife rauchen könne. So hart ist es natürlich nicht, aber main sollte gemäß Standard ein int zurückliefern. Es ist zumindestens stilistisch fraglich und formal falsch, aber kein derart großes Problem, daß es die üblichen Flames rechtfertigen würde.
Beliebt ist auch:

C++:
main(...)


Also den Rückgabewert von main ganz fortlassen. Im alten C Standard wurde dann implizit angenommen, dass ein int zurückgegeben würde. Im aktuellen Standard ist dies ein Fehler.
Last Not Least:

C++:
int main(int argc, char* argv[], char* env[])


Findet man häufig in (alten) UNIX Programmen, bei Windows weiss ich nicht. Manche Systeme geben eben als dritten Parameter an main die aktuellen Umgebnungsvariablen des Programms mit. Da die meisten Programme aber genau wissen, welche Variablen sie benötogen, können diese auch die Funktion getenv verwenden, um an ihre Variablen dranzukommen, daher ist diese Form von main ziemlich überflüssig.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 03.09.2002 um 16:23 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: