2013-03-21 56 views
1

我使用dlsym()加载的函数符号为什么要在函数中使用typedef,而将void *转换为函数指针?

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

什么是汇编错误? – 2013-03-21 10:40:57

回答

5

它在第一种情况下失败,因为func是一个变量,而不是一个类型,并且不能用于转换。

注意*是放错了地方:

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

嘿谢谢,这是有道理的。 – 2013-03-21 10:50:52

3

void *和函数指针之间的铸造被禁止,因为它很难在某些平台上实现。

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

这就是为什么铸造/从void *和功能是不允许的。当然,在大多数现代/典型的CPU上(我的意思是机器使用von Neumann architecture,而不是哈佛),演员阵容将会工作。

+0

噢,所以你的意思是说它有效,但是在其他一些架构中这可能不起作用? – 2013-03-21 10:51:26

+0

@yogeshsingh是的,将函数指针转换为void *并不方便。 – unwind 2013-03-21 11:01:32

相关问题