Main function
Jedes C-Programm, das für eine gehostete Ausführungsumgebung geschrieben wurde, enthält die Definition (nicht den Prototyp) einer Funktion namens
main
, die den festgelegten Startpunkt des Programms darstellt.
int
main
(void)
{
Rumpf
}
|
(1) | ||||||||
int
main
(
int
argc
,
char
*
argv
[
]
)
{
Rumpf
}
|
(2) | ||||||||
| /* eine andere implementierungsdefinierte Signatur */ (seit C99) | (3) | ||||||||
Inhaltsverzeichnis |
Parameter
| argc | - | Nicht-negativer Wert, der die Anzahl der an das Programm übergebenen Argumente aus der Umgebung repräsentiert, in der das Programm ausgeführt wird. |
| argv | - | Zeiger auf das erste Element eines Arrays von argc + 1 Zeigern, von denen der letzte ein Nullzeiger ist und die vorherigen, falls vorhanden, auf Zeichenketten zeigen, die die an das Programm übergebenen Argumente aus der Host-Umgebung repräsentieren. Wenn argv [ 0 ] kein Nullzeiger ist (oder äquivalent, wenn argc > 0), zeigt es auf eine Zeichenkette, die den Programmnamen repräsentiert, die leer ist, wenn der Programmname nicht von der Host-Umgebung verfügbar ist. |
Die Namen
argc
und
argv
stehen für "Argument Count" und "Argument Vector" und werden traditionell verwendet, jedoch können auch andere Namen für die Parameter gewählt werden, sowie unterschiedliche aber gleichwertige Deklarationen ihres Typs:
int
main
(
int
ac,
char
**
av
)
ist ebenso gültig.
Eine übliche implementationsdefinierte Form von main ist int main ( int argc, char * argv [ ] , char * envp [ ] ) , wobei ein drittes Argument vom Typ char ** hinzugefügt wird, das auf ein Array von Zeigern auf die Ausführungsumgebungsvariablen zeigt.
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 nicht erfolgreiche Beendigung an.
Erklärung
Die
main
Funktion wird beim Programmstart aufgerufen, nachdem alle Objekte mit statischer Speicherdauer initialisiert wurden. Sie ist der festgelegte Einstiegspunkt für ein Programm, das in einer
gehosteten
Umgebung ausgeführt wird (d.h. mit einem Betriebssystem). Der Name und Typ des Einstiegspunkts für jedes
eigenständige
Programm (Bootloader, Betriebssystemkerne etc.) sind implementierungsdefiniert.
Die Parameter der zweiparametrigen Form der Hauptfunktion ermöglichen es, beliebige Multibyte-Zeichenketten von der Ausführungsumgebung zu übergeben (diese sind typischerweise als Befehlszeilenargumente bekannt). Die Zeiger argv [ 1 ] .. argv [ argc - 1 ] zeigen auf die ersten Zeichen in jeder dieser Zeichenketten. argv [ 0 ] (falls nicht null) ist der Zeiger auf das Anfangszeichen einer nullterminierten Multibyte-Zeichenkette, die den Namen repräsentiert, der zum Aufruf des Programms selbst verwendet wurde (oder, falls dies von der Host-Umgebung nicht unterstützt wird, ist argv [ 0 ] [ 0 ] garantiert null).
Wenn die Host-Umgebung keine Klein- und Großbuchstaben bereitstellen kann, werden die Befehlszeilenargumente in Kleinbuchstaben umgewandelt.
Die Zeichenketten sind veränderbar, und alle vorgenommenen Änderungen bleiben bis zum Programmende bestehen, obwohl diese Änderungen nicht an die Host-Umgebung zurückgegeben werden: sie können beispielsweise mit strtok verwendet werden.
Die Größe des Arrays, auf das
argv
zeigt, beträgt mindestens
argc+1
, und das letzte Element,
argv[argc]
, ist garantiert ein Nullzeiger.
Die
main
Funktion hat mehrere besondere Eigenschaften:
|
Wenn die main-Funktion einen return ohne Wertangabe ausführt oder, was dasselbe ist, die abschließende } erreicht, ohne einen return auszuführen, ist der an die Host-Umgebung 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 Host-Umgebung zurückgegebene Wert unspezifiziert. Wenn der Rückgabetyp kompatibel mit int ist und die Steuerung die abschließende } erreicht, ist der an die Umgebung zurückgegebene Wert derselbe, als ob return 0 ; ausgeführt worden wäre. |
(seit C99) |
Beispiel
Demonstriert, wie ein Programm darüber informiert wird, wo es seine Eingabedaten findet und wo es seine Ergebnisse schreiben soll. Aufruf: ./a.out Eingabedatei Ausgabedatei
Mögliche Ausgabe:
argc = 3 argv[0] --> ./a.out argv[1] --> indatafile argv[2] --> outdatafile argv[argc] = (nil)
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 5.1.2.2.1 Programmstart (p: 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 Hosted environment
Siehe auch
|
C++ Dokumentation
für
main
Funktion
|