main Funktion

Die main-Funktion bezeichnet den Start eines jeden C-Programmes. Wird die main-Funktion verlassen, so wird das Programm mit dem angegebenen Rückgabewert beendet.




Hello World!
The Debugger has exited with status 0.
#include <stdio.h>

int main(){
  printf("Hello World!");
  return 0;
}

Das System übergibt jedem C-Programm einen sogenannten Argumentenvektor, welcher mit der erweiterten main-Deklaration angesprochen werden kann:

int main(int argc, char** argv);

Details

Die main-Funktion darf pro Programm nur einmal definiert werden und sie muss sich im globalen Bereich befinden. Diejenige Datei, in welcher sie definiert wird, wird als das primäre Source-File bezeichnet. Tradtionsgemäss befindet sich die main-Funktion am Ende des primären Source-Files. Dies ist üblich, da sämtliche Variablen und Funktionen, die die main-Funktion anspricht, irgendwo deklariert worden sein müssen. Durch die Definition der main-Funktion am Ende der Datei befinden sich somit die benötigten Symbole automatisch irgendwo vor der main-Funktion, und das Schreiben von Prototypen entfällt (was insbesondere bei kleinen Programmen lästig sein kann).

Die main-Funktion kann in den verschiedenen C-Dialekten die unterschiedlichsten Formen annehmen, welche grundsätzlich alle äquivalent sind. Folgendes sind die geläufigsten Angaben:

void main();
void main(void);
void main(int argc, char** argv);
void main(int argc, char* argv[]);
int  main();
int  main(void);
int  main(int argc, char** argv);
int  main(int argc, char* argv[]);

int  main(int argc, char** argv, char** env);

Der Rückgabewert der Funktion kann int oder void sein, wobei nur mit dem Rückgabewert int ein Wert zurückgegeben werden darf. Bei void nimmt der Compiler den Standard-Rückgabewert 0 an. ISO-C verlangt den Rückgabewert int.

Das System übergibt der main-Funktion stets einen Argumentenvektor. Eine parameterlose (oder mit Parameter void deklarierte) main-Funktion ignoriert diesen Vektor. Wird dieser Vektor jedoch benötigt, wird die main-Funktion nach allgemeinem Bewusstsein stets mit den beiden Parametern argc und argv deklariert. Der Parameter argc bezeichnet hierbei den Argument count, die Anzahl Argumente im Vektor. Der Parameter argv ist der Argument vector, ein Array aus Strings (char*).

Folgendes Beispiel erläutert den Umgang mit diesen Parametern:

./Program yeah! -s hello world



Number of arguments: 5


Argument 0: ./Program
Argument 1: yeah!
Argument 2: -s
Argument 3: hello
Argument 4: world


#include <stdio.h>

int main(int argc, char** argv){
  printf("Number of arguments: %d\n", argc);
  int i;
  for(i = 0; i < argc; ++i){
    printf("Argument %d: %s\n", i, argv[i]);
  }
  return 0;
}

Das Argument mit Index 0 bezeichnet stets den Namen des Programmes, wie es aufgerufen wurde (dies kann eine absolute oder relative Pfadangabe sein). Dieses Argument ist standartisiert, argc ist somit stets mindestens 1. Alle restlichen Argumente entsprechen den Strings, welche separiert durch Leerzeichen beim Aufruf des Prgrammes angegeben wurden. Es existiert stets noch ein zusätzlicher, letzter Eintrag in dem Array, der standardmässig auf NULL gesetzt ist. Dieser letzte Eintrag wird auch als Sentinel (Wächter) bezeichnet.

Die letzte Zeile der oben genannten main-Deklarationen zeigt eine eher unbekannte Eigenschaft der main-Funktion. Der optionale dritte Parameter beinhaltet eine Liste der Umgebungsvariablen, welche vom System dem Programm übergeben wird. Dieser Parameter wird normalerweise mit env (environment variables) bezeichnet. Zwar existiert keine vorgegebene Zählervariable, jedoch wird genauso wie bei der Argumentenliste auch dieses Array standardmässig mit einem Sentinel abgeschlossen, das auf NULL gesetzt ist. Folgender Code erläutert den Umgang mit diesem Parameter, wobei die Ausgabe bei jedem Benutzer anders aussehen kann:

__CF_USER_TEXT_ENCODING=0x1F5:0:3
NSUnbufferedIO=YES
SHELL=/bin/bash
HOME=/usr
DYLD_NO_FIX_PREBINDING=YES
COMMAND_MODE=unix2003
DYLD_NEW_LOCAL_SHARED_REGIONS=YES
PATH=/usr/bin:/bin:/usr/sbin:/sbin
DISPLAY=/tmp/launch-AYgTi7/:0
USERBREAK=1
...
#include <stdio.h>

int main(int argc, char** argv, char** env){
  int i = 0;
  while(1){
    if(!env[i]){break;}
    printf("%s\n", env[i]);
    i++;
  }
  return 0;
}

Rückgabewerte

Auch die main-Funktion ist eine ganz normale Funktion und kann je nach Deklaration mit der Rückgabe eines Wertes abgeschlossen werden. Üblicherweise wird ein Programm durch den Rückgabewert 0 beendet, wohingegen jeder Wert ungleich Null auf einen fehlerhaften Verlauf des Programmes hindeutet. Hierbei ist der Rückgabewert jedoch nicht standartisiert und kann frei gewählt werden. Dieser Wert ist normalerweise nicht von Bedeutung, kann jedoch beim Arbeiten mit mehreren Prozessen oder Threads eine Zusatzinformation an das aufrufende Programm sein.

Wird das Programm in einem Terminal ausgeführt, so wird das Terminal nach Beendigung des Programmes mit einer Meldung wie der folgenden antworten:



Program has exited with status 10.
int main(){
  return 10;
}

Vorsicht: Der deklarierte Typ der main-Funktion ist zwar standardgemäss int, aber das Übergeordnete Programm (beispielsweise ein Terminal) muss diesen Wert nicht zwingendermassen als solchen interpretieren. Tests auf dem System des Autors haben beispielsweise ergeben, dass der Rückgabetyp je nach Anwendung als unsigned char interpretiert wird.