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框架中使用它。它工作得很好。

相關問題