You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中无需typedef,利用已有函数声明作为函数指针类型

解决方案

C语言环境(无函数重载)

如果你用GCC、Clang或者支持C23标准的编译器,直接用typeof关键字就能复用Windows.h里现成的函数签名,不用手动写typedef:

#include <Windows.h>

int main(int argc, char** argv) {
    // 自动获取InternetConnectA的函数指针类型
    typeof(&InternetConnectA) internet_connect_a = (typeof(&InternetConnectA))find_function("wininet.dll", "InternetConnectA");
    // 直接按API原参数调用即可
    internet_connect_a(hInternet, lpszServerName, nServerPort, lpszUserName, lpszPassword, dwService, dwFlags, dwContext);
}

要是用MSVC编译器,把typeof换成__typeof就行:

__typeof(&InternetConnectA) internet_connect_a = (__typeof(&InternetConnectA))find_function("wininet.dll", "InternetConnectA");

嫌每次写typeof麻烦的话,还能快速生成typedef:

typedef typeof(InternetConnectA) InternetConnectA_t;
// 之后就可以像原来一样用这个类型别名
InternetConnectA_t internet_connect_a = (InternetConnectA_t)find_function(...);

C++语言环境(处理重载问题)

C++里因为有函数重载,直接用函数名会有歧义,但用decltype就能明确指定函数指针类型:

#include <Windows.h>

int main(int argc, char** argv) {
    decltype(&InternetConnectA) internet_connect_a = reinterpret_cast<decltype(&InternetConnectA)>(find_function("wininet.dll", "InternetConnectA"));
    internet_connect_a(...);
}

如果遇到同名重载,就得显式匹配参数类型来消除歧义:

// 强制指定参数类型,获取正确的函数指针类型
using FuncPtr = decltype(static_cast<HINTERNET(*)(HINTERNET, LPCSTR, INTERNET_PORT, LPCSTR, LPCSTR, DWORD, DWORD, DWORD_PTR)>(&InternetConnectA));
FuncPtr internet_connect_a = reinterpret_cast<FuncPtr>(find_function(...));

你原来的代码为啥跑不起来

你写的InternetConnectA*是错误写法:在C/C++里,InternetConnectA本身是函数类型,而函数指针的正确类型应该是“函数地址的类型”(也就是typeof(&InternetConnectA))。直接写InternetConnectA*会被编译器理解成“返回值为InternetConnectA类型的指针”,完全不是你要的函数指针。

内容的提问来源于stack exchange,提问作者Frederik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:45:19