Wie kommt es, dass "main" kein reserviertes Wort der Programmiersprache C ist?
main ist nicht Teil der Programmiersprache C, weil es keine außergewöhnliche Funktion für den C-Compiler darstellt. Es ist eher eine Konvention, die auf die Arbeit des Compilers keine Auswirkung hat und die jederzeit geändert werden kann.
Ein C-Programm startet nicht mit main, sondern mit der Funktion _start. Nur die schreiben wir üblicherweise nicht. Sollten wir auch nicht, denn die Funktion bereitet das vor, was wir beim Start eines Standard-C-Programms so erwarten.
Wird ein ausführbares Programm kompiliert, wird der Startcode dazugelinkt, also ein nicht vom Programmierer geschriebenes Stück Programm, welches zum Beispiel die Aufruf-Parameter des Programms, zum Beispiel
ls -lha ~/ 
vom Betriebsystem entgegen nimmt, zählt - hier 3 - und aus dem übergebenen Char-array ein Array macht: ls, -lha und ~/. Diese Funktion heißt "start". Und nachdem diese Funktion alles vorbereitet hat, was zum Start des Programms notwendig ist, ruft sie die Funktion main( 3, { "ls", "-lha", "~/" } ) auf.
Nun braucht man gerade als C-Entwickler nicht grundsätzlich Standard. Auf einem Embedded-System gibt es beispielsweise keine DOS-Box, deren Argumente man auseinander nehmen müssen. Dafür hat man so wenig Arbeitsspeicher, dass man keinen Platz für sowas hat, also nimmt man einen Startcode, der weniger macht.
Diesen Startcode kann man beim Linker austauschen und sich so beispielsweise eine optimiertere Version bauen und welche Funktion die dann aufruft, ist der dann überlassen.
Als Beispiel unterscheiden Windows-Programme zwischen einem DOS-Aufruf und einem Windows-Aufruf. Hier erklärt main nur, dass es sich um ein Windows-Programm handelt und beendet das Programm sofort wieder, während der Start über Windows in der Funktion WinMain landet.