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

C++如何通过其他指针类型调用函数指针?

错误原因

你的代码存在几个明确问题,直接导致函数无法被调用:

  • 类型不匹配:void*是对象指针类型,C++标准不支持用void*存储函数指针——函数指针和普通数据指针的内存布局、长度在部分平台上并不一致,强制转换存储属于未定义行为,可能出现各种奇怪问题。
  • 没有写调用逻辑:你最后一行写的f->functionPointer;只是读取了指针变量的值,根本没有执行函数调用操作。这行代码没有任何可观测的副作用,编译器开启优化后会直接删除这行无效语句,表现出来就是“直接跳过”。
  • 基础语法错误:class定义的成员默认是私有属性,你在main函数里直接访问functionPointer成员本身就无法通过编译;使用cout既没有包含<iostream>头文件,也没有指定std命名空间,同样会触发编译报错。
修正方案

给容器定义和目标函数签名匹配的函数指针成员,调用时补充函数调用运算符()即可,参考代码:

#include <iostream>

class FunctionContainer
{
public:
    // 声明指向无参数、无返回值函数的指针成员
    void (*functionPointer)();
};

void Test()
{
    std::cout << 'a';
}

int main()
{
    FunctionContainer* f = new FunctionContainer();
    f->functionPointer = &Test;
    // 补充()触发调用
    f->functionPointer();

    delete f;
    return 0;
}

如果需要存储不同签名的函数,不要用void*强转,C++11之后可以用std::function配合模板实现类型安全的存储,避免未定义行为。

内容的提问来源于stack exchange,提问作者Debreczeni Kálmán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:09:15