Несколько ответов указывают на uintptr_t
и #include <stdint.h>
в качестве «решения». Это, я полагаю, часть ответа, но не весь ответ. Вам также нужно посмотреть, где вызывается функция, с идентификатором сообщения FOO.
Рассмотрим этот код и компиляцию:
$ 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
$
Вы заметите, что есть проблема в месте вызова (в main()
) - преобразование целого числа в указатель без приведения. Вам нужно проанализировать ваш function()
во всех его использованиях, чтобы увидеть, как ему передаются значения. Код внутри моего function()
будет работать, если будут записаны вызовы:
unsigned long i = 0x2341;
function(1, &i);
Так как ваши, вероятно, написаны по-другому, вам нужно просмотреть точки, где вызывается функция, чтобы убедиться, что имеет смысл использовать значение, как показано. Не забывайте, что вы можете найти скрытую ошибку.
Кроме того, если вы собираетесь отформатировать значение параметра void *
(в преобразованном виде), внимательно посмотрите на заголовок <inttypes.h>
(вместо stdint.h
- inttypes.h
предоставляет услуги stdint.h
, что необычно, но стандарт C99 гласит [t] заголовок <inttypes.h>
включает заголовок <stdint.h>
и расширяет его
дополнительные возможности, предоставляемые размещенными реализациями ) и использованием макросов PRIxxx в строках формата.
Кроме того, мои комментарии строго применимы к C, а не к C ++, но ваш код находится в подмножестве C ++, которое переносимо между C и C ++. Скорее всего, мои комментарии применимы.