Kilka odpowiedzi wskazywały na uintptr_t
i #include <stdint.h>
jako „” rozwiązania. To jest, jak sugeruję, część odpowiedzi, ale nie cała odpowiedź. Musisz również sprawdzić, gdzie wywoływana jest funkcja z identyfikatorem wiadomości FOO.
Rozważ ten kod i kompilację:
$ 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
$
Zauważysz, że występuje problem w miejscu wywołania (in main()
) - konwersja liczby całkowitej na wskaźnik bez rzutowania. Będziesz musiał przeanalizować function()
wszystkie jego zastosowania, aby zobaczyć, jak przekazywane są do niego wartości. Kod wewnątrz mojego function()
działałby, gdyby wywołania były napisane:
unsigned long i = 0x2341;
function(1, &i);
Ponieważ twoje są prawdopodobnie napisane inaczej, musisz przejrzeć punkty, w których funkcja jest wywoływana, aby upewnić się, że ma sens użycie wartości, jak pokazano. Nie zapominaj, że możesz znaleźć ukryty błąd.
Ponadto, jeśli zamierzasz sformatować wartość void *
parametru (jako przekonwertowaną), spójrz uważnie na <inttypes.h>
nagłówek (zamiast stdint.h
- inttypes.h
zapewnia usługi stdint.h
, co jest niezwykłe, ale standard C99 mówi, że [t] on nagłówek <inttypes.h>
zawiera nagłówek <stdint.h>
i rozszerza go o dodatkowe udogodnienia zapewniane przez hostowane implementacje ) i użyj makr PRIxxx w ciągach formatujących.
Ponadto moje komentarze odnoszą się ściśle do C, a nie C ++, ale Twój kod należy do podzbioru C ++, który jest przenośny między C i C ++. Są duże szanse, że moje uwagi będą miały zastosowanie.
size_t
niedziałającej pamięci jest segmentowana pamięć i386. Chociaż jest to maszyna 32-bitowa,sizeof
wraca2
dosize_t
. Odpowiedź Alex poniżej wydaje się poprawna. Odpowiedź Alexauintptr_t
działa prawie wszędzie i jest teraz standardem. Zapewnia obsługę C ++ 11, a nawet zapewnia ochronę nagłówka C ++ 03.