关于 C 的函数指针指向任意函数类型

2019-06-17 19:34:55 +08:00
 haozhang

如果我想要表达一个指向任意函数类型的函数指针的话,用:

typedef void (*Function)(void);
Function f = ...;

还是使用:

typedef void *(*Function)(void *);
Function f = ...;

又或者用别的什么方式呢?

3695 次点击
所在节点    C
29 条回复
catror
2019-06-17 19:38:50 +08:00
void* 就可以了
haozhang
2019-06-17 19:42:58 +08:00
@catror 其实我感觉反正到时候调用函数还是需要强制类型转换的,这里 typedef 写什么都不会影响最终的函数调用= =
letianqiu
2019-06-17 19:53:56 +08:00
@haozhang 你的写法根本不能指向任意函数类型。C 里面只有 void *类型表示任意指针类型。你的第一个写法表示的是一个没有参数,没有返回值的函数的指针。第二个写的是一个接受一个指针参数,返回一个指针的函数的指针。
fcten
2019-06-17 20:01:33 +08:00
建议直接用 intptr_t 存,反正使用的时候都要强制转换
haozhang
2019-06-17 20:01:52 +08:00
@letianqiu 强制类型转换就可以了啊,比如:
```
int a() {
return 1;
}
Function f = (void (*)(void))a;
((int (*)(void))f)() // 返回 1
```
void *是不能指向函数的。
haozhang
2019-06-17 20:06:10 +08:00
我二了,试了一下,void *就可以了,直接强制类型转换一下就可以了= =
int a() {return 1;}
void *f = (void *)a;
((int (*)(void))f)(); // 返回 1
haozhang
2019-06-17 20:06:33 +08:00
@letianqiu 我错了,void * 可以指向函数的= =
zaiyund
2019-06-17 20:08:00 +08:00
我觉得 catror 的说法靠谱
letianqiu
2019-06-17 20:11:34 +08:00
@haozhang void *是可以指向任意指针的,当然包括函数啊。C 里面本来也不存在范型的函数,所以调用的时候都要强制类型转换,void *足够了
letianqiu
2019-06-17 20:12:43 +08:00
@haozhang 指针可以直接赋值给 void *类型,不需要强制类型转换。
haozhang
2019-06-17 20:17:21 +08:00
@letianqiu 我试了啊,直接不强制类型转换报错的....void *p = xxx_function;
letianqiu
2019-06-17 20:50:26 +08:00
@haozhang C++下是会报错的。C 是不会报错的
letianqiu
2019-06-17 21:05:01 +08:00
https://isocpp.org/wiki/faq/pointers-to-members#cant-cvt-fnptr-to-voidptr
更正一下,C++下是不能把函数赋值给 void *类型的变量的。
wutiantong
2019-06-18 00:32:06 +08:00
@letianqiu 你没有给出正确的参考,因为 pointer to member function 是不同于 pointer to function 的
wutiantong
2019-06-18 00:36:11 +08:00
@letianqiu 事实上,C++里 pointer to function 是可以转成 void *的
wheeler
2019-06-18 00:53:22 +08:00
catror
2019-06-18 01:08:23 +08:00
@haozhang 本质上就是存一个地址值,你强转成任意类型都没问题,只要保证转回来还是一样的就行。建议不要直接用 void*,还是用 typedef 定义一个别名,这样即使遇到 16 楼的链接里提到的情况,修改一下定义就行。
catror
2019-06-18 01:14:44 +08:00
@wheeler 第一次知道还有函数指针跟数据指针长度不一样的架构,学习了。
iwong0exv2
2019-06-18 07:18:35 +08:00
请参考 dlsym (in Linux) or GetProcAddress (in Windows)
visionsmile
2019-06-18 08:18:31 +08:00
@catror #18 C++里成员函数指针和普通的指针不一样,在有些编译器实现里它本质是个结构,存放着真正的函数指针和对 this 的偏移值~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/574837

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX