Diverse risposte hanno indicato uintptr_te #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.hfornisce 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_tnon funzionamento è la memoria segmentata i386. Sebbene sia una macchina a 32 bit,sizeofritorna2persize_t. La risposta di Alex di seguito sembra corretta. La risposta di Alex euintptr_tfunziona praticamente ovunque ed è ora standard. Fornisce un trattamento C ++ 11 e fornisce anche le protezioni per le intestazioni C ++ 03.