有几个答案指向uintptr_t
和#include <stdint.h>
称为“解决方案”。我建议,这是答案的一部分,而不是全部答案。您还需要查看消息ID为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标准指出,标题<inttypes.h>
包含标题<stdint.h>
和通过托管实现提供的其他功能对其进行扩展),并在格式字符串中使用PRIxxx宏。
另外,我的评论严格适用于C而不是C ++,但是您的代码位于C ++的子集中,该子集可在C和C ++之间移植。我的评论适用的机会是公平的。
size_t
无法运行的一个具体示例是i386分段内存。虽然32位机,sizeof
返回2
对size_t
。以下Alex答案似乎正确。亚历克斯(Alex)的答案并uintptr_t
适用于几乎所有地方以及现在的标准。它提供了C ++ 11处理,甚至提供了C ++ 03标头保护。