簡介
乙個可變引數函式是指乙個函式擁有不定的引數,即為乙個函式可接收多個引數。有時我們會遇到一些算術問題需要用到,比如是計算傳入引數的總和,字串的連線或是其它操作過程,我們在 oc 裡也經常使用,最經典的就是 nslog( c 為 printf ) ,它可以指定格式的輸出,格式化輸出的內容。
現在我們先來看看普通函式的定義方法。
普通函式
一般我們定義的函式都是指定有多少個引數,如果是有三個引數,我們可以這樣寫。
- (void)exampleobj:(nsstring *)obj obj2:(nsstring *)obj2 obj3:(nsstring *)obj3
這樣有乙個問題,如果我們需要計算值,比如需要計算5個或10個數值相加的執行,那我們在函式裡是不是需要定義5個或10個的引數?如果有100個數值需要計算 …… 。
可變引數函式
現在,我們可以通過定義 可變引數函式 去實現剛剛的問題,比如我們現在需要傳進來引數的數值之和,而且傳的引數個數是不固定的。可變引數函式的定義方法很簡單,我們在引數的後面加上 ", ..."就可以了,例如。
- (void)exampleobj:(nsstring *)obj obj2:(nsstring *)obj2 obj3:(nsstring *)obj3, ...
現在,我們回到剛剛的難題,這個函式主要是用來計算使用者傳進來的數值之和。
- (int)sum:(int)num, ...
va_end(arg_list);
return
result;
}
va_list:用來儲存巨集 va_start 、va_arg 和 va_end 所需資訊的一種型別。為了訪問變長引數列表中的引數,必須宣告 va_list 型別的乙個物件。
va_start:訪問變長引數列表中的引數之前使用的巨集,它初始化用 va_list 宣告的物件,初始化結果供巨集va_arg和va_end使用;
va_arg:展開成乙個表示式的巨集,該表示式具有變長引數列表中下乙個引數的值和型別。每次呼叫 va_arg 都會修改,用 va_list 宣告的物件從而使該物件指向引數列表中的下乙個引數。
va_end:該巨集使程式能夠從變長引數列表用巨集 va_start 引用的函式中正常返回。
使用方法
使用方法也很簡單,在可變引數裡,所有引數均用逗號隔開。
nslog(@"%d", [self sum:1, 34, nil]);
注意事項
使用的時候,可變參後最後麵加乙個nil值,這樣是代表結束的意思。就像uialertview初始化的那樣,它一開始不知道你有多少個button,你可以自由地往裡加button,最後也是由乙個nil結束,所以兩個是一樣的道理。
注意點
1)當我們要建立乙個可變引數函式時,必須把省略號( ... )放到引數列表後面,同時也只能擁有乙個這樣的格式,因為我們不能定義兩個可變的引數。
2)當我們需要讀取 可變引數列表 時,必須先指定乙個變數 va_list ,然後使用巨集 va_start 、va_arg、va_end 來獲取。
參考:c可變引數函式 實現 ——
維基百科.可變引數函式 —— 可變引數函式
博文出處:
ios開發 Object C可變引數函式
簡介 乙個可變引數函式是指乙個函式擁有不定的引數,即為乙個函式可接收多個引數。有時我們會遇到一些算術問題需要用到,比如是計算傳入引數的總和,字串的連線或是其它操作過程,我們在 oc 裡也經常使用,最經典的就是 nslog c 為 printf 它可以指定格式的輸出,格式化輸出的內容。現在我們先來看看...
ios開發 Object C可變引數函式
簡介 乙個可變引數函式是指乙個函式擁有不定的引數,即為乙個函式可接收多個引數。有時我們會遇到一些算術問題需要用到,比如是計算傳入引數的總和,字串的連線或是其它操作過程,我們在 oc 裡也經常使用,最經典的就是 nslog c 為 printf 它可以指定格式的輸出,格式化輸出的內容。現在我們先來看看...
IOS之學習筆記六 可變形參
1 va list 這是乙個可變型別,用於定義指向可變引數列表的指標變數 2 va start 讓arglist指向乙個可變引數列表的第乙個引數 3 提取arglist當前指標指向的引數,並且將指標指向下乙個引數 4 釋放arglist指標,結束提取 args.h ifndef args h def...