首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果余弦是fptr,如何解析*(void **) (& cosine )

如果余弦是fptr,如何解析*(void **) (& cosine )
EN

Stack Overflow用户
提问于 2017-09-22 19:28:35
回答 3查看 292关注 0票数 2

找到此代码示例

代码语言:javascript
运行
复制
void *handle;
double (*cosine)(double);
handle = dlopen("libm.so", RTLD_LAZY);
*(void **) (&cosine) = dlsym(handle, "cos");

我使用从右到左的读取规则来解析变量的类型:

代码语言:javascript
运行
复制
double (*cosine)(double);

在这里,我从左向右写,但移动LTR:"cosine“”-> "*“->”是一个指针,“那么"(”我们在最里面的()作用域->“( -> )”->“之外运行,函数取一个双”->“,然后返回最左边的”双“。

但这到底是什么?我甚至不知道从哪里开始解析) "&cosine“是一个地址或引用吗?(空**)是什么意思?为什么最左边的"*“在外面?是脱节还是打字?

代码语言:javascript
运行
复制
*(void **) (&cosine)
EN

Stack Overflow用户

发布于 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时,两者都是未定义的行为,但后者并不是那么黑暗的魔法。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46371952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档