man page的dlsym()列出
*(void **) (&cosine) = dlsym(handle, "cos");
作为强制转换dlsym()返回值的解决方法.
*(void **)(&余弦)在这里是什么意思?我知道余弦是先前定义的函数指针,但我不确定为什么&符为何.名称前需要(没有&的错误).而且,我不知道为什么void *(void **)的指针再次与*一起使用.
解决方法:
让我们一次解开它:
&cosine
这需要一个指向变量余弦的指针,因此它将是一个指向函数指针的指针.
(void **) &cosine
我们将指针到函数指针转换为指针到无效指针.
* (void **) &cosine
我们取消引用强制转换的指针,将dlsym()的结果分配给它.
实际上,正在发生的事情是问题的一个回避步骤.我们没有将dlsym()的结果强制转换为正确的函数指针类型,而是假装余弦是一个void *(通过间接级别)并分配给它.