有几个答案指出uintptr_t
并#include <stdint.h>
作为“解决方案”。也就是说,我建议,部分答案,但不是全部答案。您还需要查看使用 FOO 的消息 ID 调用函数的位置。
考虑这段代码和编译:
$ 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++ 子集中。我的评论适用的机会是公平的。