Várias respostas apontaram uintptr_t
e #include <stdint.h>
como 'a' solução. Essa é, eu sugiro, parte da resposta, mas não toda a resposta. Você também precisa verificar onde a função é chamada com o ID de mensagem FOO.
Considere este código e compilação:
$ 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
$
Você observará que há um problema no local de chamada (in main()
) - converter um inteiro em um ponteiro sem uma conversão. Você precisará analisá-lo function()
em todos os seus usos para ver como os valores são passados para ele. O código dentro do meu function()
funcionaria se as chamadas fossem escritas:
unsigned long i = 0x2341;
function(1, &i);
Como os seus provavelmente estão escritos de forma diferente, você precisa revisar os pontos onde a função é chamada para garantir que faz sentido usar o valor conforme mostrado. Não se esqueça, você pode estar encontrando um bug latente.
Além disso, se você for formatar o valor do void *
parâmetro (conforme convertido), observe cuidadosamente o <inttypes.h>
cabeçalho (em vez de stdint.h
- inttypes.h
fornece os serviços de stdint.h
, o que é incomum, mas o padrão C99 diz [t] que o cabeçalho <inttypes.h>
inclui o cabeçalho <stdint.h>
e estende-o com recursos adicionais fornecidos por implementações hospedadas ) e usa as macros PRIxxx em suas strings de formato.
Além disso, meus comentários são estritamente aplicáveis a C em vez de C ++, mas seu código está no subconjunto de C ++ que é portável entre C e C ++. As chances são boas de que meus comentários se apliquem.
size_t
não funcionamento é a memória segmentada i386. Embora seja uma máquina de 32 bits,sizeof
retorna2
parasize_t
. A resposta de Alex abaixo parece correta. A resposta de Alexuintptr_t
funciona em quase todos os lugares e agora é padrão. Ele fornece um tratamento C ++ 11 e até mesmo fornece proteções de cabeçalho do C ++ 03.