Namespaces
Variants

Main function

From cppreference.net

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:

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

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

#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)

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