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

C语言中是否存在类似void*的通用任意函数指针类型?

C标准是否支持通用函数指针类型?

C标准里没有像void*那样专门的通用函数指针类型,但可以通过现有规则实现类似“通用传递”的效果,具体如下:

为什么不能用void*存函数指针?

C标准明确区分了“对象指针(指向数据)”和“函数指针”——两者属于不同的指针类别,标准不保证它们的内存表示、大小一致,直接把函数指针转成void*或者反过来,属于未定义行为,虽然部分平台可能兼容,但完全不具备可移植性。

合法的通用函数指针传递方式

C标准规定:任意函数指针都可以转换为其他函数指针类型,再转换回原类型时,必须能得到原始的指针值。基于这条规则,我们可以选一个“占位用”的函数指针类型作为通用载体,比如typedef void (*GenericFuncPtr)(void);,用它来传递任意函数指针,回调函数再把它转换回实际需要的原型即可。

举个实际代码示例:

// 定义通用函数指针载体
typedef void (*GenericFuncPtr)(void);

// 回调函数类型,接收通用函数指针参数
typedef void (*EventCallback)(GenericFuncPtr func_ptr);

// 注册回调的函数
void RegisterEvent(EventCallback callback, GenericFuncPtr func_ptr) {
    // 实际场景中会存储回调和指针,这里直接触发演示
    callback(func_ptr);
}

// 某个具体的目标函数
void PrintHello(const char* msg) {
    printf("Hello: %s\n", msg);
}

// 对应PrintHello的回调处理函数
void HandlePrintHello(GenericFuncPtr func_ptr) {
    // 转换回原函数指针类型
    void (*printFunc)(const char*) = (void (*)(const char*))func_ptr;
    printFunc("World");
}

int main() {
    // 注册时把目标函数转成通用类型传递
    RegisterEvent(HandlePrintHello, (GenericFuncPtr)PrintHello);
    return 0;
}

关键注意事项

  • 转换后的函数调用必须严格匹配原型:如果用错误的函数原型调用,属于未定义行为,可能导致程序崩溃、数据损坏等问题。
  • 必须确保回调函数知道要转换的目标原型:就像你用void*传递数据时需要知道实际类型一样,用通用函数指针传递时,回调函数必须明确知晓原始函数的原型,否则无法正确转换和调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:05:32