【发布时间】:2017-04-20 02:27:10
【问题描述】:
dlsym() 列表中的man page
*(void **) (&cosine) = dlsym(handle, "cos");
作为转换 dlsym() 的返回值的解决方法。
这里*(void **) (&cosine)是什么意思?我知道cosine 是之前定义的函数指针,但我不确定为什么名称前需要一个& 符号&(没有& 的错误)。此外,我不明白为什么void * (void **) 的指针又与* 一起使用。
【问题讨论】:
-
这假定
double (*cosine)(double);或类似的较早声明。 -
非常常见的问题。如果数据指针和代码指针大小相同,则此“解决方案”可以完美运行。否则它会严重失败。
-
@LorinczyZsigmond 总的来说你是对的,但
dlsym专门来自 POSIX,它要求这在符合要求的实现中有效。换句话说,POSIX 只允许具有平面内存模型的平台,其中所有指针都相同。 -
@ephemient 我想我知道更好的解决方案:stackoverflow.com/a/36388869/4844822
-
@ZsigmondLőrinczy 仅仅因为它们的大小相同并不意味着您可以在它们之间投射。根据 C 标准,编译器将转换为不同类型的函数指针的数据或函数指针视为无效值是完全合法的(因为它是未定义的行为)。