为什么需要将typedef转换为函数,同时将void *转换为函数指针?

时间:2013-03-21 09:58:10

标签: c++ casting function-pointers

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

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

这导致编译错误。 但是,当我将typedef用于

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

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

2 个答案:

答案 0 :(得分:5)

它在第一种情况下失败,因为func是变量而不是类型,并且不能在演员表中使用。

请注意*放错地方了:

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

答案 1 :(得分:3)

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

有些计算机(参见Harvard architecture),其中代码和数据存在于物理上不同的记忆中。所以,仅仅因为你有一个指向某些数据的指针,这并不意味着将它转换为指向代码的指针是有意义的。

这就是为什么不允许向void *和/ {{1}}进行投射。当然,在大多数现代/典型的CPU(我指的是使用von Neumann architecture而不是哈佛)的机器上,演员都可以使用。