天天看點

OC中 多參數省略函數的聲明和實作

oc開發中,我們也會發現會有類似于nslog(nsstring *format, ...)的函數,那麼這種帶有省略符号的函數是如何内部實作的呢,下面解開神秘面紗。

下面,我們對nslog函數進行展開

void nslog(nsstring *format, ...)

{

// 提取整個參數清單 并輸出

        va_list argp = null;

va_start(argp, format);

nsstring *printfstring = nil;

while(printfstring = va_arg(argp,id))

        {

              printf("%s",printfstring);

        }

va_end(argp);

}

解析:

#define va_start(v,l)    __builtin_va_start(v,l)

va_start(arglist,statement):使參數清單指針arg_ptr指向函數參數清單中的第一個可選參數,說明:argn是位于第一個可選參數之前的固定參數,(或者說,最後一個固定參數;…之前的一個參數),函數參數清單中參數在記憶體中的順序與函數聲明時的順序是一緻的。如果有一va函數的聲明是void va_test(char a, char b, char c, …),則它的固定參數依次是a,b,c,最後一個固定參數argn為c,是以就是va_start(arg_ptr, c)。

#define va_end(v)    __builtin_va_end(v)

va_end(arg_ptr):清空參數清單,并置參數指針arg_ptr無效。

#define va_arg(v,l)    __builtin_va_arg(v,l)

va_arg(arglist,id):傳回參數清單中指針arg_ptr所指的參數,傳回類型為type,并使指針arg_ptr指向參數清單中下一個參數。