找到此代码示例
void *handle;
double (*cosine)(double);
handle = dlopen("libm.so", RTLD_LAZY);
*(void **) (&cosine) = dlsym(handle, "cos");我使用从右到左的读取规则来解析变量的类型:
double (*cosine)(double);在这里,我从左向右写,但移动LTR:"cosine“”-> "*“->”是一个指针,“那么"(”我们在最里面的()作用域->“( -> )”->“之外运行,函数取一个双”->“,然后返回最左边的”双“。
但这到底是什么?我甚至不知道从哪里开始解析) "&cosine“是一个地址或引用吗?(空**)是什么意思?为什么最左边的"*“在外面?是脱节还是打字?
*(void **) (&cosine)发布于 2017-09-22 19:53:42
对于C,可以将指向void的指针转换为没有强制转换的对象的任何指针。但是,C标准并不保证可以将void *转换为指向函数的指针--因为函数不是对象。
dlsym是POSIX函数;POSIX要求作为扩展,指向函数的指针必须可转换到void *并再次返回。但是,C++不允许在没有强制转换的情况下进行这种转换。
无论如何,*(void **) (&cosine) = dlsym(handle, "cos");强制转换意味着指向函数(双)返回双的指针的指针被转换为指向无效指针的指针,然后取消引用以获得void *类型的lvalue,将dlsym的返回值赋给它。这是相当丑陋的,在需要强制转换的地方,应该以cosine = (double (*)(double))dlsym(handle, "cos")的形式编写。当涉及到C时,两者都是未定义的行为,但后者并不是那么黑暗的魔法。
https://stackoverflow.com/questions/46371952
复制相似问题