g++ Ärger
Jan-Benedict Glaw
jbglaw at lug-owl.de
Mon Apr 18 15:37:58 CEST 2005
On Mon, 2005-04-18 15:10:05 +0200, Jan 'Red Bully' Seiffert <redbully at cc.fh-luh.de>
wrote in message <4263B1AD.4090708 at cc.fh-luh.de>:
> Jan-Benedict Glaw schrieb:
> > return vs. exit(). EXIT_SUCCESS und EXIT_FAILURE sind ja mal auf die
> > Bühne gezaubert worden, um sinnvolle Werte auch auf VMS zurückgeben zu
> > können (da sieht das nämlich anders aus, als bei allen anderen
> > Betriebssystemen...). '0' benutze ich bei returns, EXIT_SUCCESS bei
> > exit() und _exit(). IIRC setzen die portierten libcs einen return-Wert
> > von 0 ebensogut um wie einen _exit()-Wert von EXIT_SUCCESS.
> >
> Naja, ich bevorzuge immer EXIT_{SUCCESS|FAILURE}, da sie zum C-Std.
> gehoeren (also wirklich in ihrer Bedeutung festgegossen sind), und dabei
> ausnamsweise auch sehr plastisch/lesbar. Man sieht halt sofort, was da
> zurueckgegeben wird, ob mit exit() oder return.
Unter VMS sollte ein "return 0;" aus main() heraus aber etwas _anderes_
machen, als ein "exit (EXIT_SUCCESS);" -- ebenfalls aus main() heraus.
Wenn die glibc genommen wird, müßte unter VMS diese null später in eine
andere Zahl umgesetzt werden, bevor diese dann als exit-Wert dem
Betriebssystem übergeben wird. (So kann dann aus einem return 0 in
main() auch wieder ein EXIT_SUCCESS werden:-)
Hintergrund: exit() muß ja nicht unbedingt immer als letztes statement
in main() stehen, sondern kann auch von gaaanz wo anders kommen. ...und
sollte dann (recht zügig) das Programm beenden.
return kann auch von überall herkommen. Unterscheidet man nun zwischen
exit() und return (_auch_ in main()), so läßt sich auch später
vorhandener Code in libs pressen. Wenn man main() jetzt in
print_hello_world() umbenennt, wird der Unterschied klar:
Innerhalb von C/C++ erwartet man null als "Alles Okay!"-Rückgabewert,
aber nicht EXIT_SUCCESS, was unter VMS _nicht_ null ist. Wird
andersherum aber main() mit "return 0;" verlassen, hat
__libc_start_main() (IIRC heißt so die libc-interne Funktion, die main()
aufruft) die Möglichkeit, das zum Schluß in ein EXIT_SUCCESS umzusetzen.
> Dass das wegen der verdrehten Logig von VMS eingefuehrt wurde, nagut,
> schraenkt es einen sogar ein, weil man nur ja oder nein Uebergeben kann
> (der Standart garantiert einem keinen weiteren Gueltigen
> EXIT_FAILURE-Wert), also keine Spielchen mit Rueckgabewert spiegelt
> Fehler wieder, vielleicht.
> Aber es kostet nichts und das als Portabilitaets-Plus abseits von POSIX
> kann man sich goennen, IMHO.
Siehe oben. Nicht zwischen return und exit zu unterscheiden _mindert_
hier die Portabilität. Denn zu schnell hat man da mal ein
if (! some_function ())
printf ("hat geklappt\n");
stehen, was nicht mehr funktioniert, wenn man in some_function() mit
return EXIT_SUCCESS unter VMS aussteigt.
Somit müßte man, wenn man sich auf EXIT_{SUCCESS,FAILURE} als
return-Wert einlassen will, auch entsprechend prüfen:
if (some_function () == EXIT_SUCCESS)
printf ("hat geklappt\n");
> > Vielleicht sollte ich mal VMS auf meinen VAXen installieren?
> >
> Musst du wissen, ist deine VAX :]
> Nur, was willst du damit?
Ich bleib lieber bein Linux auf VAX :)
MfG, JBG
--
Jan-Benedict Glaw jbglaw at lug-owl.de . +49-172-7608481 _ O _
"Eine Freie Meinung in einem Freien Kopf | Gegen Zensur | Gegen Krieg _ _ O
fuer einen Freien Staat voll Freier Bürger" | im Internet! | im Irak! O O O
ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM | TCPA));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lug-owl.de/pipermail/linux/attachments/20050418/55b98076/attachment.sig>
More information about the Linux
mailing list