我们如何解决C4055警告?

Ben*_*min 3 c visual-studio visual-c++

这是C4055警告消息.

'conversion':从数据指针'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'
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 10

WDK头文件不是那么干净.MmGetSystemRoutineAddress()的返回类型应该是声明FARPROC而不是PVOID.不过,这并不为你会写与WDK的设备驱动程序的任何计算机上无所谓,一个void*可以转换为函数的地址没有问题,数据和代码的指针有32位和64位平台上的相同尺寸.当我们得到分段记忆模型的痛苦时,这将是一个寒冷的日子.

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


Tro*_*nic 7

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

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