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参数进行地图查找解释的代码)
您几乎必须使用每个体系结构的程序集才能执行此操作.首先,你不能使用varargs,因为 - 正如你暗示的那样 - varargs的调用ABI与非varargs的调用ABI不同; 参数编码方式不同,寄存器状态在调用边界上不同.
最简单的方法是创建大量的存根函数,以及您需要的所有论证变体.然后,每个存根都会获取特定的参数,并将它们捆绑到更通用的内容中,以便代码更常用.
如果你不想走那条路,那么你将不得不知道参数的类型,特定目标ABI的参数的编码规则,然后你需要编写代码来有效地撕掉它当您的通用蹦床被调用时,他们的隐藏洞中的争论.
并且你需要做所有这些,同时也不要通过无意的寄存器使用来破坏任何参数.你可能会发现我的objc_msgSend()的写了是间接有用的,因为它描述的Objective-C究竟如何处理这个问题(提示:去竭尽全力,以不触及任何的参数超出了前两个).
| 归档时间: |
|
| 查看次数: |
704 次 |
| 最近记录: |