Sven P. schrieb:
> Rolf Magnus schrieb:
>> Die meisten Compiler lassen es trotzdem zu.
>
> Eine POSIX-konforme Umgebung muss es sogar zulassen.
Ja, obwohl es damit eben im Widerspruch zu ISO C steht.
> Diese Festlegung wurde irgendwann mal nötig, als die dynamische Linkerei
> kam, so von wegen dlsym() und so.
Naja, nötig würde ich nicht unbedingt sagen. Funktionszeiger
untereinander sind ja durchaus castbar, also hätte man auch eine
Funktion schreiben können, die einen void(*)(void) zurückgibt, und der
kann dann bequem in den Zielfunktionszeiger gecastet werden. Man hätte
halt nur nicht mehr eine einzelne Funktion für Funktions- und
Objektzeiger gehabt, sondern eben zwei.
Und wie ich gerade auf http://en.wikipedia.org/wiki/Dynamic_loading
lese, hätte das eigentlich auch mal so werden sollen:
The fact remains that any conversion between function and object
pointers has to be regarded as an (inherently non-portable)
implementation extension, and that no "correct" way for a direct
conversion exists, since in this regard the POSIX and ISO standards
contradict each other.
Because of this problem, the POSIX documentation on dlsym() (issue 6)
stated that "a future version may either add a new function to return
function pointers, or the current interface may be deprecated in favor
of two new functions: one that returns data pointers and the other that
returns function pointers".[7] However, the most current version of the
standard (issue 7, 2008) simply states that function pointers have to be
convertible to void* for POSIX compliance,[8] leaving compiler makers to
choose which standard they adhere to.