Varias respuestas han señalado uintptr_ty #include <stdint.h>como "la" solución. Eso es, sugiero, parte de la respuesta, pero no toda la respuesta. También debe observar dónde se llama a la función con el ID de mensaje de FOO.
Considere este código y compilación:
$ 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
$
Observará que hay un problema en la ubicación de la llamada (en main()): convertir un entero en un puntero sin conversión. Vas a necesitar analizar tu function()en todos sus usos para ver cómo se le pasan los valores. El código dentro de mi function()funcionaría si las llamadas estuvieran escritas:
unsigned long i = 0x2341;
function(1, &i);
Dado que el suyo probablemente esté escrito de manera diferente, debe revisar los puntos donde se llama a la función para asegurarse de que tenga sentido usar el valor como se muestra. No lo olvide, puede estar encontrando un error latente.
Además, si va a formatear el valor del void *parámetro (como convertido), mire detenidamente el <inttypes.h>encabezado (en lugar de stdint.h- inttypes.hproporciona los servicios de stdint.h, lo cual es inusual, pero el estándar C99 dice que [t] el encabezado <inttypes.h>incluye el encabezado <stdint.h>y lo extiende con facilidades adicionales proporcionadas por implementaciones alojadas ) y use las macros PRIxxx en sus cadenas de formato.
Además, mis comentarios son estrictamente aplicables a C en lugar de C ++, pero su código está en el subconjunto de C ++ que es portátil entre C y C ++. Las posibilidades de que se apliquen mis comentarios son justas a buenas.
size_tno funciona es la memoria segmentada i386. Aunque una máquina de 32 bits,sizeofdevuelve2asize_t. La respuesta de Alex a continuación parece correcta. Alex responde yuintptr_tfunciona en casi todas partes y ahora es estándar. Proporciona un tratamiento de C ++ 11 e incluso proporciona protecciones de encabezado de C ++ 03.