Hauptfunktion
Jedes C-Programm, das für die Ausführung in einer gehosteten Ausführungsumgebung entwickelt wurde, enthält die Definition (nicht den Prototyp) einer Funktion namens main, die den designierten Startpunkt des Programms darstellt.
int main (void) { body } |
(1) | ||||||||
int main (int argc, char *argv[]) { body } |
(2) | ||||||||
| /* andere implementierungsdefinierte Signatur */ (seit C99) | (3) | ||||||||
Inhalt |
[bearbeiten] Parameter
| argc | - | Nicht-negativer Wert, der die Anzahl der Argumente darstellt, die dem Programm aus der Umgebung, in der das Programm ausgeführt wird, übergeben wurden. |
| argv | - | Zeiger auf das erste Element eines Arrays von argc + 1 Zeigern, wobei der letzte ein Nullzeiger ist und die vorhergehenden, falls vorhanden, auf Zeichenketten zeigen, die die dem Programm aus der Host-Umgebung übergebenen Argumente darstellen. Wenn argv[0] kein Nullzeiger ist (oder äquivalent dazu, wenn argc > 0), zeigt er auf eine Zeichenkette, die den Programmnamen darstellt, welcher leer ist, wenn der Programmnamenicht aus der Host-Umgebung verfügbar ist. |
Die Namen argc und argv stehen für "argument count" (Argumentanzahl) und "argument vector" (Argumentvektor) und werden traditionell verwendet, aber andere Namen können für die Parameter gewählt werden, ebenso wie unterschiedliche, aber äquivalente Deklarationen ihres Typs: int main(int ac, char** av) ist ebenso gültig.
Eine übliche, implementierungsdefinierte Form von main ist int main(int argc, char *argv[], char *envp[]), bei der ein drittes Argument vom Typ char**, das auf ein Array von Zeigern auf die Ausführungsumgebungsvariablen zeigt, hinzugefügt wird.
[bearbeiten] Rückgabewert
Wenn die return-Anweisung verwendet wird, wird der Rückgabewert als Argument für den impliziten Aufruf von exit() verwendet (siehe unten für Details). Die Werte null und EXIT_SUCCESS zeigen eine erfolgreiche Beendigung an, der Wert EXIT_FAILURE zeigt eine erfolglose Beendigung an.
[bearbeiten] Erklärung
Die Funktion main wird beim Programmstart aufgerufen, nachdem alle Objekte mit statischer Speicherdauer initialisiert wurden. Sie ist der designierte Einstiegspunkt für ein Programm, das in einer *gehosteten* Umgebung (d.h. mit einem Betriebssystem) ausgeführt wird. Der Name und Typ des Einstiegspunkts für jedes *freistehende* Programm (Bootloader, Betriebssystem-Kernel usw.) sind implementierungsdefiniert.
Die Parameter der zweiparametrigen Form der main-Funktion ermöglichen die Übergabe beliebiger Multibyte-Zeichenketten aus der Ausführungsumgebung (diese sind typischerweise als *Kommandozeilenargumente* bekannt). Die Zeiger argv[1] .. argv[argc-1] zeigen auf die ersten Zeichen jeder dieser Zeichenketten. argv[0] (falls nicht null) ist der Zeiger auf das erste Zeichen einer null-terminierten Multibyte-Zeichenkette, die den Namen darstellt, mit dem das Programm selbst aufgerufen wurde (oder, falls dies von der Host-Umgebung nicht unterstützt wird, ist garantiert, dass argv[0][0] null ist).
Wenn die Host-Umgebung keine Klein- und Großbuchstaben bereitstellen kann, werden die Kommandozeilenargumente in Kleinbuchstaben umgewandelt.
Die Zeichenketten sind modifizierbar, und alle vorgenommenen Änderungen bleiben bis zur Programmbeendigung bestehen, obwohl diese Änderungen nicht an die Host-Umgebung zurückpropagiert werden: Sie können beispielsweise mit strtok verwendet werden.
Die Größe des von argv gezeigten Arrays beträgt mindestens argc+1, und das letzte Element, argv[argc], ist garantiert ein Nullzeiger.
Die Funktion main hat mehrere besondere Eigenschaften
|
Wenn die main-Funktion eine return-Anweisung ausführt, die keinen Wert angibt, oder, was dasselbe ist, die schließende } erreicht, ohne eine return-Anweisung auszuführen, ist der an die Ausführungsumgebung zurückgegebene Beendigungsstatus undefiniert. |
(bis C99) |
|
Wenn der Rückgabetyp der main-Funktion nicht kompatibel mit int ist (z.B. void main(void)), ist der an die Ausführungsumgebung zurückgegebene Wert nicht spezifiziert. Wenn der Rückgabetyp mit int kompatibel ist und die Kontrolle die schließende } erreicht, ist der an die Umgebung zurückgegebene Wert derselbe, als ob return 0; ausgeführt worden wäre. |
(seit C99) |
[bearbeiten] Beispiel
Demonstriert, wie ein Programm über seinen Eingabeort und seinen Ausgabeort informiert werden kann. Aufruf: ./a.out indatafile outdatafile
Mögliche Ausgabe
argc = 3 argv[0] --> ./a.out argv[1] --> indatafile argv[2] --> outdatafile argv[argc] = (nil)
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 5.1.2.2.1 Programmstart (S: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 5.1.2.2.1 Programmstart (S: 10-11)
- C11-Standard (ISO/IEC 9899:2011)
- 5.1.2.2.1 Programmstart (S: 13)
- C99-Standard (ISO/IEC 9899:1999)
- 5.1.2.2.1 Programmstart (S: 12)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 5.1.2.2 Gehostete Umgebung
[bearbeiten] Siehe auch
| C++ Dokumentation für
main Funktion |