Viele Leute und sogar einige Bücher auf dem Markt verwenden void main(), was eigentlich falsch ist. void main( ) wurde in C/C++ nie definiert. Bjarne Stroustrup, der Vater von C++, hat in den FAQ auf seiner Homepage klargestellt, dass die Definition void main( ) { /* ... */ } nicht C++ ist und nie war, noch war es überhaupt C.( void main ( ) existierte nie in C++ oder C). Lassen Sie mich über die Definition der Hauptfunktion in den C- bzw. C++-Standards sprechen.
1. Main() in C-Sprache
In C89 ist main() akzeptabel. Brian W. Kernighan und Dennis M. Ritchies klassisches Meisterwerk The C Programming Language 2e („C Programming Language Second Edition“) verwendet main(). Allerdings sind im neuesten C99-Standard nur die folgenden zwei Definitionen korrekt:
int main(void)
int main(int argc, char *argv[])
(Referenz: ISO/IEC 9899:1999 (E) Programmiersprachen? C 5.1.2.2.1 Programmstart)
Natürlich können wir auch einige kleine Änderungen vornehmen. Beispiel: char *argv[] kann als char **argv geschrieben werden; argv und argc können in andere Variablennamen (z. B. intval und charval) geändert werden, sie müssen jedoch den Namensregeln für Variablen entsprechen.
Wenn Sie keine Parameter über die Befehlszeile abrufen müssen, verwenden Sie bitte int main(void); andernfalls verwenden Sie bitte int main(int argc, char *argv[]).
Der Rückgabewerttyp der Hauptfunktion muss int sein, damit der Rückgabewert an den Aufrufer des Programms (z. B. das Betriebssystem) übergeben werden kann.
Wenn am Ende der Hauptfunktion keine Return-Anweisung steht, legt C99 fest, dass der Compiler automatisch return 0 zur generierten Zieldatei (z. B. der exe-Datei) hinzufügen soll, was darauf hinweist, dass das Programm normal beendet wird . Ich empfehle jedoch dennoch, am Ende der Hauptfunktion eine Return-Anweisung hinzuzufügen. Dies ist zwar nicht notwendig, aber eine gute Angewohnheit. Beachten Sie, dass vc6 return 0; nicht zur Zieldatei hinzufügt. Dies liegt wahrscheinlich daran, dass vc6 ein Produkt von 1998 war und diese Funktion daher nicht unterstützt. Jetzt verstehen Sie, warum ich Ihnen empfehle, eine Rückgabeerklärung hinzuzufügen! Allerdings fügt gcc3.2 (C-Compiler unter Linux) return 0; zur generierten Objektdatei hinzu.
2. Main() in C++
C++98 definiert die folgenden zwei Möglichkeiten zur Definition der Hauptfunktion:
int main( )
int main(int argc, char *argv[])
Referenz: ISO/IEC 14882 (1998-9-01) Programmiersprachen? C++ 3.6 Start und Beendigung
int main() entspricht int main(void) in C99; die Verwendung von int main(int argc, char *argv[]) ist ebenfalls dieselbe wie die in C99 definierte. Ebenso muss der Rückgabewerttyp der Hauptfunktion ebenfalls int sein. Wenn am Ende der Hauptfunktion keine Return-Anweisung steht, schreibt C++98 vor, dass der Compiler automatisch return 0 zur generierten Objektdatei hinzufügen soll. Ebenso unterstützt vc6 diese Funktion nicht, g++3.2 (der C++-Compiler unter Linux) jedoch schon.
3. Über void main()
In C und C++ ist der Prototyp einer Funktion, die keine Parameter empfängt oder Informationen zurückgibt, „void foo(void); ". Vielleicht glauben viele Leute aus diesem Grund fälschlicherweise, dass die Hauptfunktion als void main (void) definiert werden kann, wenn das Programm keinen Wert zurückgeben muss. Aber das ist falsch! Der Rückgabewert der Hauptfunktion sollte als int-Typ definiert werden, was in den C- und C++-Standards festgelegt ist. Obwohl void main in einigen Compilern (z. B. vc6) kompiliert werden kann, unterstützen nicht alle Compiler void main, da void main im Standard nie definiert wurde. Wenn in g++3.2 der Rückgabewert der Hauptfunktion nicht vom Typ int ist, wird die Kompilierung überhaupt nicht bestanden. gcc3.2 gibt eine Warnung aus. Wenn Sie möchten, dass Ihr Programm daher hochgradig portierbar ist, verwenden Sie unbedingt int main.
Entschuldigen Sie sich nicht, indem Sie sagen: „Mein Lehrer hat mir gesagt, dass es das Richtige ist.“ Lehrer haben die schlechte Angewohnheit, falsch zu liegen. Durch das Schreiben von sicherem, standardkonformem Code kann sich jeder auf andere Themen in Ihrem Programm konzentrieren, anstatt Zeit mit diesen Standardaufgaben zu verschwenden.
Es sollte darauf hingewiesen werden, dass es in einigen Systemen zu einer Stapelausnahme und einem Systemausfall kommen kann, wenn das Programm mit void main definiert wird oder keinen Rückgabewert hat. (Einzelheiten finden Sie im englischen Teil unten)
Die Funktion des Rückgabewerts
Der Rückgabewert der Hauptfunktion wird verwendet, um den Exit-Status des Programms anzuzeigen. Wenn 0 zurückgegeben wird, bedeutet dies, dass das Programm normal beendet wird. Die Bedeutung anderer zurückgegebener Zahlen wird vom System bestimmt. Normalerweise weist eine Rückgabe ungleich Null darauf hin, dass das Programm abnormal beendet wurde. Lassen Sie uns ein kleines Experiment in der WinXP-Umgebung durchführen. Kompilieren Sie zunächst das folgende Programm:
int main(void)
{
return 0;
}
Öffnen Sie dann den Anhang „Eingabeaufforderung“, führen Sie die gerade kompilierte ausführbare Datei in der Befehlszeile aus, geben Sie dann „echo %ERRORLEVEL%“ ein und drücken Sie die Eingabetaste. Sie können sehen, dass der Rückgabewert des Programms 0 ist. Gehen Sie davon aus, dass es sich bei der gerade kompilierten Datei um eine.exe handelt. Wenn Sie „a && dir“ eingeben, werden die Ordner und Dateien im aktuellen Verzeichnis aufgelistet. Wenn Sie es jedoch in „return -1“ oder einen anderen Wert ungleich Null ändern und dann neu kompilieren und „a && dir“ eingeben, wird dir nicht ausgeführt. Denn die Bedeutung von && ist: Wenn das Programm vor && normal beendet wird, wird das Programm nach && weiterhin ausgeführt, andernfalls wird es nicht ausgeführt. Mit anderen Worten: Mithilfe des Rückgabewerts des Programms können wir steuern, ob das nächste Programm ausgeführt werden soll. Dies ist der Vorteil von int main. Wenn Sie interessiert sind, können Sie auch den Rückgabewerttyp der Hauptfunktion in einen Nicht-Int-Typ (z. B. Float) ändern, neu kompilieren und „a && dir“ ausführen, um zu sehen, was passiert, und darüber nachdenken, warum das passiert. Übrigens, wenn Sie ein ||-Verzeichnis eingeben, bedeutet dies, dass bei einem abnormalen Beenden das Verzeichnis ausgeführt wird.
5. Was ist mit int main(int argc, char *argv[], char *envp[])?
Natürlich ist dies nicht im Standard-C/C++ definiert! char *envp[] ist eine erweiterte Funktion, die von einigen Compilern zum Abrufen von Systemumgebungsvariablen bereitgestellt wird. Da es sich nicht um einen Standard handelt, wird er nicht von allen Compilern unterstützt. Daher ist die Portabilität schlecht und wird nicht empfohlen – es sei denn, Ihr Programm ist speziell für die Arbeit in einer bestimmten Umgebung konzipiert und muss die Umgebungsvariablen des Systems abrufen.