В нескольких ответах указывалось 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
$
Вы заметите, что в месте вызова (in 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 ++. Шансы на то, что мои комментарии применимы, весьма велики.
size_t
неработающей - сегментированная память i386. Хотя 32-битной машине,sizeof
возвращается2
дляsize_t
. Ответ Алекса ниже кажется правильным. Ответ Алекс иuintptr_t
работает почти везде, и теперь это стандарт. Он обеспечивает обработку C ++ 11 и даже дает защиту заголовка C ++ 03.