x64编译下FARPROC转LPWINVERIFYTRUST函数类型不兼容警告求解
警告产生原因
GetProcAddress是Windows平台用来获取动态库导出函数地址的API,它的返回值固定为FARPROC类型,该类型被定义为无参数、返回值为整型的函数指针long long int (*)(),和你自定义的带3个入参的LPWINVERIFYTRUST函数指针签名不匹配。- 编译器开启
-Wcast-function-type检查时(高版本GCC、Clang默认开启),就会对这类不匹配的函数指针强制转换抛出警告,该检查和编译架构无关,x64场景下同样会生效。 - 这个警告本质是风险提示:如果你自定义的
LPWINVERIFYTRUST签名和WinVerifyTrust官方实际签名不一致(比如参数个数、类型、调用约定写错),运行时会直接出现参数取值错误、栈损坏的问题,哪怕是调用约定统一的x64架构也无法避免这类错误。
解决方案
方案1:精准屏蔽单处警告(最推荐)
确认你自定义的函数指针签名完全和官方 WinVerifyTrust 一致的前提下,在转换代码前后加编译指令,仅屏蔽当前位置的对应警告,不影响全局检查:
typedef LONG (WINAPI *LPWINVERIFYTRUST)(HWND hwnd, GUID *pgActionID, LPVOID pWVTData); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-function-type" auto WinVerifyTrust_I = reinterpret_cast<LPWINVERIFYTRUST>(GetProcAddress(wintrust, "WinVerifyTrust")); #pragma GCC diagnostic pop
建议把C风格强制转换替换为 reinterpret_cast,符合C++类型转换规范。
方案2:复用官方预定义类型
无需自己手写 LPWINVERIFYTRUST 类型定义,直接引入Windows官方头文件 <WinTrust.h>,头文件内已经预置了完全正确的函数指针类型,避免手写typedef写错参数的风险,从根源降低类型不匹配的可能。
方案3:全局关闭警告(不推荐)
如果项目内大量存在动态加载API的场景,可以在编译参数中添加 -Wno-cast-function-type 全局关闭该警告,但会丢失所有函数指针转换的风险校验,容易隐藏潜在的bug,不建议使用。
内容的提问来源于stack exchange,提问作者KungPhoo
相关产品推荐
相关产品推荐

