В нескольких ответах указывалось 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.