为什么需要将typedef转换为函数,而将void*强制转换为函数指针

Why typedef to a function is required, while casting void* to function pointer?

本文关键字:转换 函数 void 指针 而将 typedef 为什么      更新时间:2023-10-16

我使用dlsym()来加载一个函数符号

void (*func)(int);
func = (func*)dlsym(phandle, "function");

这会导致编译错误。但是,当我对function

进行类型定义时
 typedef void (*func)(int);
 func function = null;
 function = (func*)dlsym(phandle, "function");

这编译得很好,但我不明白,为什么它在第一种情况下失败?谁能告诉我原因?我读到c++标准不允许从void*到函数指针的直接转换?为什么会这样? typedef是如何解决这个问题的?

在第一种情况下失败,因为func是一个变量,而不是类型,不能在强制转换中使用。

注意*放错位置了:

typedef void (*func)(int);
           /* ^ must be here. */

禁止在void *和函数指针之间进行强制转换,因为在某些平台上很难实现。

有些计算机(参见哈佛体系结构)的代码和数据驻留在物理上不同的内存中。所以,仅仅因为你有一个指向某些数据的指针,这并不意味着将它神奇地转换为指向代码的指针是有意义的。

这就是为什么不允许转换到/从void *和函数。当然,在大多数现代/典型的cpu(我指的是使用冯·诺伊曼架构的机器,而不是哈佛)上,转换将工作。