1. 程式人生 > >ios開發-Object-C可變引數函式

ios開發-Object-C可變引數函式

簡介

一個可變引數函式是指一個函式擁有不定的引數,即為一個函式可接收多個引數。有時我們會遇到一些算術問題需要用到,比如是計算傳入引數的總和,字串的連線或是其它操作過程,我們在 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, ...
{
    int result = num;
    int objNum;
    
    va_list arg_list;
    va_start(arg_list, num);
    while ((objNum = va_arg(arg_list, int))) {
        result += objNum;
    }
    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可變引數函式 實現 —— http://blog.csdn.net/weiwangchao_/article/details/4857567

維基百科.可變引數函式 —— http://zh.wikipedia.org/wiki/可變引數函式

博文作者:GarveyCalvin

本文版權歸作者和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作!

相關推薦

ios開發Object-C可變引數函式

簡介 一個可變引數函式是指一個函式擁有不定的引數,即為一個函式可接收多個引數。有時我們會遇到一些算術問題需要用到,比如是計算傳入引數的總和,字串的連線或是其它操作過程,我們在 OC 裡也經常使用,最經典的就是 NSLog( C 為 printf ) ,它可以指定格式的輸出,格式化輸出的內容。 現在我們

iOS開發Object-C獲取手機裝置資訊(UIDevice)

一、獲取UiDevice裝置資訊 // 獲取裝置名稱 NSString *name = [[UIDevice currentDevice] name]; // 獲取裝置系統名稱 NSString *systemName = [[UIDevice currentDevice] systemName

C可變引數函式 實現

  C函式要在程式中用到以下這些巨集: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr )

iOS開發筆記--Objective-C中根據函式名呼叫函式

Objective-C中呼叫函式的方法是“訊息傳遞”,這個和普通的函式呼叫的區別是,你可以隨時對一個物件傳遞任何訊息,而不需要在編譯的時候宣告這些方法。所以Objective-C可以在runtime的時候傳遞訊息。 主要用到:SEL和@selector,當然還有perf

C 可變引數函式的本質

C語言支援定義可變引數的函式,方法是在函式的引數列表最後加上 " ... ",代表變長的引數列表,例如: void Func(int num, ...) { } 需要注意 “...” 必須在最後,而且前面起碼要有一個固定的引數,型別可以任意。 為什麼要有一個固定的引數呢?這篇文章要說明的就是這個問題。

iOS 開發ObjectC 運算子

參考文章 : 1. 算術運算子算術運算子 : 加(+), 減(-), 乘(*), 除(/), 模(%), 自增(++);-- 其它運算 : 如果需要平方開放運算, 使用 math.h 中得方法即可;原始

IOS開發筆記12Object-C中的物件與記憶體

前言 Object-C的記憶體管理機制與java那種全自動的垃圾回收機制是不同的,它本質上還是c語言的手動管理方式,只不過稍微加了一些自動方法。 指標和指標的值 以下程式宣告一個指向NSDate例項的變數: #import <Found

C/C++中用va_start/va_arg/va_end實現可變引數函式的原理

C/C++中用va_start/va_arg/va_end實現可變引數函式的原理與例項詳解         在C/C++中,我們經常會用到可變引數的函式(比如printf/snprintf等),本篇筆記旨在講解編譯器藉助va_start/va_arg/va

[C++] Variadic Fuction Template 可變引數函式模板

可變引數函式模板(variadic function template)主要使用了包擴充套件(pack expansion)的方式,即”...”,把一個模式(pattern)擴充套件為包中每一個元素(e

關於C語言可變引數函式的寫法及其應用

以前一直以為C語言的函式都是精確匹配的,直到看了 C和C指標 才知道還有可變引數的函式。仔細一想,平時最常用的printf ,scanf 不就是可變引數的嗎。 先上程式碼,隨後詳細講解可變引數函式的用法。 #include<stdio.h> #inc

C語言不定引數個數,可變引數函式使用學習

stdarg.h提供了三個巨集,書寫可變引數函式可以用到 void va_start(va_list ap, last); type va_arg(va_list ap, type); void va_end(va_list ap); 上面巨集的字首va表示variab

C可變引數函式實現

一、 從printf()開始原型:int printf(const char * format, ...);引數format表示如何來格式字串的指令,…表示可選引數,呼叫時傳遞給"..."的引數可有可無,根據實際情況而定。系統提供了vprintf系列格式化字串的函式,用於程式

C語言中的可變引數函式 三個點“…”

第一篇 C語言程式設計中有時會遇到一些引數個數可變的函式,例如printf()函式,其函式原型為: int printf( const char* format, ...); 它除了有一個引數format固定以外,後面跟的引數的個數和型別是可變的(用三個點“…”做引數佔位符)

go語言學習之可變引數函式

      1 // 遍歷可變引數列表——獲取每一個引數的值 2 package main 3 4 import( 5 "fmt" 6 "bytes" 7 ) 8 9 func joinString(stringList ...s

c可變引數詳解

前言 最近翻到今年前自己寫的hello word 的劣質程式碼。突然看見printf,這個可變引數的函式。而平時所編寫的都是固定引數。所以今天一步步德瞭解下可變引數函式的實現原理。 編寫一個自己寫的printf()函式。 需要了解的函式引數 1.可以通過…三個點表示可變引數 2.

攔截任意object-c類的函式

一種有缺點的方法 想攔截object-c類的函式,有一種方法是額外寫擴充套件類,例如下面程式碼: @interface UIView(fordebug) - (void)removeFromSuperview; @end @implementation UIView(fordebug)

C 可變引數

有時,可能會碰到這樣的情況,希望函式帶有可變數量的引數,而不是預定義數量的引數。C 語言為這種情況提供了一個解決方案,它允許定義一個函式,能根據具體的需求接受可變數量的引數。下面的例項演示了這種函式的定義。 int func(int, ... ) { . . . }

iOS開發,匯入c檔案引發的Could not build module 'Foundation'問題(轉)

iOS開發,匯入c檔案引發的 Unknown type name ‘NSString’ 問題 今天看到個問題,編輯工程提示Unknown type name ‘NSString’,如下圖 導致出現異常的原因是是因為工程中添加了ZipArchive(第三方開源解壓縮庫)

iOS開發筆記--Objective-C實現多繼承

我們都知道objective C不能像C++一樣支援多繼承,但是在OC的使用經常會碰到需要使用多繼承的情況。例如,ClassA中有methodA,ClassB中methodB,而現在需要使用這兩個類中的方法。如何按照C++的程式設計思路,毫無疑問採用多繼承就搞定

linux C 可變引數

有時,您可能會碰到這樣的情況,您希望函式帶有可變數量的引數,而不是預定義數量的引數。C 語言為這種情況提供了一個解決方案,它允許您定義一個函式,能根據具體的需求接受可變數量的引數。下面的例項演示了這種函式的定義。 int func(int, ... ) { . . . } int mai