我们如何解决C4055警告?

时间:2010-03-06 13:19:28

标签: c visual-studio visual-c++

这是C4055警告信息。

  

'转换':从数据指针'type1'到函数指针'type2'
      数据指针(可能不正确)转换为函数指针       这是/ Za下的1级警告和/ Ze下的4级警告。

我们如何解决此警告?(以正确的方式,而不是技巧)

修改

这是一段代码摘要警告。

typedef NTSTATUS (*t_ObRegisterCallbacks)
(
  IN POB_CALLBACK_REGISTRATION CallBackRegistration,
  OUT PVOID *RegistrationHandle
);

t_ObRegisterCallbacks   g_ObRegisterCallbacks = NULL;

void foo()
{
  g_ObRegisterCallbacks = (t_ObRegisterCallbacks)MmGetSystemRoutineAddress(&regName); //C4055
}
//warning C4055: 'type cast' : from data pointer 'PVOID' to function pointer 't_ObRegisterCallbacks'

2 个答案:

答案 0 :(得分:10)

WDK头文件不是那么干净。 MmGetSystemRoutineAddress()的返回类型应该是声明FARPROC而不是PVOID。尽管如此,在使用WDK编写设备驱动程序的任何机器上都无关紧要,void *可以无问题地转换为函数地址,数据和代码指针在32位和64位平台上具有相同的大小。当我们得到分段记忆模型的痛苦时,这将是一个寒冷的日子。

我建议您只需使用#pragma warning(禁用:4055)

关闭警告

答案 1 :(得分:7)

不允许在数据和函数指针之间进行转换。您可以使用union hack进行类型转换:包含两个指针的union类型,然后写入一个类型并作为另一个类型读取。毋庸置疑,就标准而言,这是不可移植的,但它使编译器感到高兴并且经常在实践中起作用。

将函数指针作为数据指针返回的函数(dlsym是这种类型的一个流行函数)被设计破坏了,你只能通过诸如union hack之类的技巧来解决这个问题。