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
相关产品推荐
相关产品推荐

