Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  1 766
Hei, jeg har kommet over en litt rar casting som jeg har problemer med å forstå, så jeg henvender med til freakene for å få en bedre forklaring på dette.

Jeg referer til man-page for C funksjonen dlsym ( ).

Sitat av Man - dlsym ()
/* Writing: cosine = (double (*)(double)) dlsym(handle, "cos"); would seem more natural, but the C99 standard leaves casting from "void *" to a function pointer undefined. The assignment used below is the POSIX.1-2003 (Technical Corrigendum 1) workaround; see the Rationale for the POSIX specification of dlsym(). */

*(void **) (&cosine) = dlsym(handle, "cos");
Vis hele sitatet...
Jeg ville ha castet denne som beskrevet øverst:

Kode

cosine = ( double ( * )( double )) dlsym ( handle, "cos" );
Hvorfor er dette feil måte å gjøre det på? Da tenker jeg på endringen som er gjort i ISO/IEC 9899:1999 standarden som levner denne "undefined"?

Og hva gjør egentlig denne castingen? Kan noen forklare meg det?

Kode

*(void **) (&cosine) = dlsym(handle, "cos");
linux.die.net - dlsym man page
Noen andre stilte samme spørsmål for et par måneder siden her:
http://stackoverflow.com/questions/1...different-ways

Og rationale her:
http://pubs.opengroup.org/onlinepubs...ons/dlsym.html
Sist endret av Dyret; 6. desember 2013 kl. 03:29.