我使用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是如何解决这个问题的?
答案 0 :(得分:5)
它在第一种情况下失败,因为func
是变量而不是类型,并且不能在演员表中使用。
请注意*
放错地方了:
typedef void (*func)(int);
/* ^ must be here. */
答案 1 :(得分:3)
禁止在void *
和函数指针之间进行转换,因为在某些平台上很难实现。
有些计算机(参见Harvard architecture),其中代码和数据存在于物理上不同的记忆中。所以,仅仅因为你有一个指向某些数据的指针,这并不意味着将它转换为指向代码的指针是有意义的。
这就是为什么不允许向void *
和/ {{1}}进行投射。当然,在大多数现代/典型的CPU(我指的是使用von Neumann architecture,而不是哈佛)的机器上,演员都可以使用。