1

我想为一些Objective-C运行时方法创建一个包装类,以便于测试(存根等),并且我想知道如何处理传递从Objective-C方法到C函数的可变参数。将Objective-C方法中的变量参数列表传递给C函数

例如,我想换一个C函数用下面的函数签名:

id objc_msgSend(id theReceiver, SEL theSelector, ...) 

我明白我可以使用“...”运算符Objective-C的方法,但我怎么能把这个传递给C函数?

- (id)msgSend:(id)theReceiver selector:(SEL)theSelector, ... 
{ 
    return objc_msgSend(theReceiver, theSelector, ...) // <-- how to pass variable arguments? 
} 
+0

重复询问有关传递可变参数列表的方法的方法,但答案也适用于此问题。 – rmaddy

+0

虽然这个问题与其他问题“相似”,但我不同意它是“重复”。 – 5StringRyan

回答

2

你不能。可变参数不能传递。你可以做的最接近的事情是寻找一个函数的变体,它需要一个va_list而不是可变参数,然后初始化一个va_list并将它传递给该函数。

回到过去,objc_msgSend()有这样一个伴侣功能叫objc_msgSendv()。自那时起它已被弃用和删除。但是,与该功能,你可以这样做:

- (id)sendMessageTo:(id)selfish selector:(SEL)sel, ... 
{ 
    va_list args; 
    va_start(args, sel); 
    id retVal = objc_msgSendv(selfish, sel, args); 
    va_end args; 
    return retVal; 
} 
+0

无赖,这将是第二个有用的功能,已被弃用,我已经在上个月左右碰到了。 – 5StringRyan

+0

@ 5StringRyan是的,太糟糕了苹果删除它:( – 2013-06-26 04:47:28

+1

它不是很有用,因为它只适用于首先声明为可变参数的方法,这是非常非常少的。即你不能用它作为通用转发机制。 – bbum

1

你不能纯C做到这一点。但为此目的,存在libffi,Apple已经(或已经)使用它来进行语言桥接。我在我的AOP框架中使用它。它工作得很好。

相关问题