有没有办法从varargs函数的参数中检索浮点数?

Jar*_*tar 3 c objective-c variadic-functions

如果函数是用原型定义的,该原型明确说明了参数的类型,例如.

void somefunc(int arg1, float arg2);
Run Code Online (Sandbox Code Playgroud)

但实施为

void somefunc(int arg1, ...) { ... }
Run Code Online (Sandbox Code Playgroud)

是否可以使用va_arg来检索浮点数?它通常被禁止这样做,因为varargs函数具有隐式类型提升,例如float to double,因此尝试检索未启动类型是不受支持的,即使使用未启动类型调用函数对更具体的函数原型也是如此.

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

这最好是独立于架构(因此,如果没有其他相同的代码在模拟器和设备上工作),尽管如果没有办法这样做,那么将接受设备特定的修复.

编辑:忘了具体提到:函数知道参数的类型和数量(它查找要使用SEL _cmd参数进行地图查找解释的代码)

bbu*_*bum 6

您几乎必须使用每个体系结构的程序集才能执行此操作.首先,你不能使用varargs,因为 - 正如你暗示的那样 - varargs的调用ABI与非varargs的调用ABI不同; 参数编码方式不同,寄存器状态在调用边界上不同.

最简单的方法是创建大量的存根函数,以及您需要的所有论证变体.然后,每个存根都会获取特定的参数,并将它们捆绑到更通用的内容中,以便代码更常用.

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

并且你需要做所有这些,同时也不要通过无意的寄存器使用来破坏任何参数.你可能会发现我的objc_msgSend()的写了是间接有用的,因为它描述的Objective-C究竟如何处理这个问题(提示:去竭尽全力,以触及任何的参数超出了前两个).