011
16.08.2006, 20:43 Uhr
0xdeadbeef
Gott (Operator)
|
Also: Im ISO-C-Standard steht drin, dass es für main genau zwei gültige Signaturen gibt, die jeder Compiler unterstützen muss, nämlich
C++: |
int main(void); int main(int argc, char *argv[]);
|
Kompatible Formen, also z.B.
C++: |
int main(int argc, char **argv);
|
sind ebenfalls erlaubt. Außerdem gibt er explizit an, dass main auf jeden Fall int zurückzugeben hat. Der Hintergrund ist, dass die umgebende Shell den Rückgabewert eines Programms auswerten kann. Daher auch return 0;, das bedeuter per Konvention "alles gut gelaufen". Auf einigen älteren Plattformen kann die Benutzung von "void main" zu einem stack overflow in der Shell führen, und viele moderne Compiler lehnen die Form inzwischen generell einfach ab.
In C++ ist es insofern etwas anders, als dass der Standard explizit die Formen
C++: |
int main(); int main(int argc, char *argv[]);
|
angibt, und dass main implizit 0 zurückgibt, wenn nichts anderes angegeben wurde. Dass return 0; kann da also entfallen. Der Hintergrund hier ist, dass
C++: |
int main(); int main(void);
|
in C++ äquivalent sind, in C jedoch nicht. In C bedeutet
dass foo eine Funktion ohne Rückgabewert ist, die beliebig viele Parameter entgegennimmt, dagegen ist
eine Funktion ohne Rückgabewert, die auch keine Parameter entgegennimmt. Der hauptsächliche Nutzen dieser Unterscheidung ergibt sich bei der Benutzung von Funktionspointern z.B. für signal handling (siehe gtk+). In C++ müsste man für die erste Form
schreiben. Des weiteren ist %d das format flag für int, nicht long int. Allerdings hab ich mich da vorhin auch vertan, ich bitte das zu entschuldigen - hab lang nichts mehr mit C gemacht. Für long int muss es natürlich %ld heißen, nicht %l - ich habe das im anderen Beitrag inzwischen behoben. %d steht dabei für "decimal", %ld meint "long decimal". -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 16.08.2006 um 20:46 Uhr von 0xdeadbeef editiert. |