gpt4 book ai didi

c - 有没有办法从可变参数函数的参数中检索 float ?

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:47 25 4
gpt4 key购买 nike

如果函数是使用原型(prototype)定义的,该原型(prototype)明确说明了参数的类型,例如。

void somefunc(int arg1, float arg2);

但实现为

void somefunc(int arg1, ...) { ... }

是否可以使用 va_arg 检索 float ?通常会阻止这样做,因为可变参数函数具有隐式类型提升,例如 float 到 double,因此不支持尝试检索未提升的类型,即使使用未提升的类型调用该函数对更具体的函数原型(prototype)也是如此。

这样做的原因是在运行时检索不同类型的参数,作为 obj-c 解释器的一部分,其中一个函数将被所有不同类型的方法重用。

这最好是独立于体系结构(这样如果没有其他东西,相同的代码可以在模拟器和设备上运行),尽管如果没有办法做到这一点,那么将接受设备特定的修复。

编辑:忘了特别提到:该函数知道参数的类型和数量(它通过带有 SEL _cmd 参数的映射查找来查找要解释的代码)

最佳答案

您几乎必须使用基于架构的程序集来执行此操作。首先,您不能使用可变参数,因为——正如您暗示的那样——可变参数的调用 ABI 不同于非可变参数的调用 ABI;参数的编码方式不同,调用边界上的寄存器状态也不同。

执行此操作的最简单方法是创建大量 stub 函数,其中包含您将需要的所有论证变体。每个 stub 然后采用特定的参数并将它们捆绑成更通用的东西,供您的代码更通用地使用。

如果你不想走那条路,那么你将不得不知道参数的类型,特定目标 ABI 的参数编码规则,然后你需要将代码编写到当您的通用蹦床被调用时,有效地将参数从它们的隐藏孔中撕掉。

并且您需要完成所有这些操作,同时不会因无意使用寄存器而破坏任何参数。你可能会找到我的 write-up of objc_msgSend()间接有用,因为它准确地描述了 Objective-C 是如何处理这个问题的(提示:它竭尽全力触及除前两个之外的任何参数)。

关于c - 有没有办法从可变参数函数的参数中检索 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2875670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com