Diverse risposte hanno indicato uintptr_t
e #include <stdint.h>
come "la" soluzione. Cioè, suggerisco, parte della risposta, ma non l'intera risposta. È inoltre necessario esaminare dove viene chiamata la funzione con l'ID messaggio di FOO.
Considera questo codice e la compilazione:
$ cat kk.c
#include <stdio.h>
static void function(int n, void *p)
{
unsigned long z = *(unsigned long *)p;
printf("%d - %lu\n", n, z);
}
int main(void)
{
function(1, 2);
return(0);
}
$ rmk kk
gcc -m64 -g -O -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith \
-Wcast-qual -Wstrict-prototypes -Wmissing-prototypes \
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE kk.c -o kk
kk.c: In function 'main':
kk.c:10: warning: passing argument 2 of 'func' makes pointer from integer without a cast
$
Noterai che c'è un problema nella posizione di chiamata (in main()
) - convertire un intero in un puntatore senza cast. Avrai bisogno di analizzare il tuo function()
in tutti i suoi usi per vedere come gli vengono passati i valori. Il codice all'interno del mio function()
funzionerebbe se le chiamate fossero scritte:
unsigned long i = 0x2341;
function(1, &i);
Poiché i tuoi sono probabilmente scritti in modo diverso, devi rivedere i punti in cui viene chiamata la funzione per assicurarti che abbia senso usare il valore come mostrato. Non dimenticare che potresti trovare un bug latente.
Inoltre, se intendi formattare il valore del void *
parametro (come convertito), guarda attentamente l' <inttypes.h>
intestazione (invece di stdint.h
- inttypes.h
fornisce i servizi di stdint.h
, il che è insolito, ma lo standard C99 dice [t] che l'intestazione <inttypes.h>
include l'intestazione <stdint.h>
e lo estende con funzionalità aggiuntive fornite dalle implementazioni ospitate ) e utilizza le macro PRIxxx nelle stringhe di formato.
Inoltre, i miei commenti sono strettamente applicabili a C piuttosto che a C ++, ma il tuo codice è nel sottoinsieme di C ++ che è portabile tra C e C ++. Ci sono buone possibilità che i miei commenti siano validi.
size_t
non funzionamento è la memoria segmentata i386. Sebbene sia una macchina a 32 bit,sizeof
ritorna2
persize_t
. La risposta di Alex di seguito sembra corretta. La risposta di Alex euintptr_t
funziona praticamente ovunque ed è ora standard. Fornisce un trattamento C ++ 11 e fornisce anche le protezioni per le intestazioni C ++ 03.