为什么需要将typedef转换为函数,而将void*强制转换为函数指针
Why typedef to a function is required, while casting void* to function pointer?
我使用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(我指的是使用冯·诺伊曼架构的机器,而不是哈佛)上,转换将工作。
相关文章:
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C++:用户定义的显式类型转换函数错误
- 为什么下面带有非常量转换函数的代码没有歧义?
- 为什么转换函数声明不需要至少一个定义类型说明符
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- C++ 通过自定义赋值运算符隐式转换函数参数
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 在C++中自动向下转换函数参数
- static_cast:转换函数模板——它们真的有效吗
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 隐式转换函数的返回对象时是否会影响性能?
- C++不存在合适的转换函数
- 为什么允许 int 和 const int 使用不同的转换函数?
- 使用转换函数直接初始化
- 为什么用户定义的转换函数模板不能有推导的返回类型?
- 为什么我会收到转换函数错误
- 选择用于赋值初始化的转换函数的优先级
- 我收到错误:没有合适的转换函数从 std::basic_istream<char、std::char_traits<char>> 到 char 存在
- 具有转换函数的 lambda,指向具有 C++ 链接的函数的指针
- 使用模板和部分专用化生成类型转换函数