Namensräume
Varianten
Aktionen

Hauptfunktion

Von cppreference.com
< c‎ | Sprache

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

1) Ein Prototyp für diese Funktion darf nicht vom Programm bereitgestellt werden.
2) Wenn der Rückgabetyp der main-Funktion kompatibel mit int ist, dann ist die Rückkehr vom anfänglichen Aufruf von main (aber nicht die Rückkehr von einem nachfolgenden, rekursiven Aufruf) äquivalent zur Ausführung der Funktion exit, wobei der von der main-Funktion zurückgegebene Wert als Argument übergeben wird (was dann die mit atexit registrierten Funktionen aufruft, alle Streams löscht und schließt und mit tmpfile erstellte Dateien löscht und die Kontrolle an die Ausführungsumgebung zurückgibt).
3)

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

#include <stdio.h>
 
int main(int argc, char *argv[])
{
    printf("argc = %d\n", argc);
    for (int ndx = 0; ndx != argc; ++ndx)
        printf("argv[%d] --> %s\n", ndx, argv[ndx]);
    printf("argv[argc] = %p\n", (void*)argv[argc]);
}

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