在c/c++中,我們經常會需要實現類似printf這樣的函式,即函式的引數個數是不定的,這個時候就需要用到我們這篇文章講到的方法啦。
首先,我們要知道這種函式,如何來定義。比如我想實現乙個函式能夠支援 fun("%d",1);
那麼這個函式的定義實際上如下:
voidfun(constchar*fmt, ...);
其中...的意思是說引數無法一一列出,所以用...代替,至於怎麼解,我們稍後再說。
比較特殊的一點是,如果你希望將上面的函式定義成乙個巨集,那麼這個巨集可以這樣寫:
#definefun(fmt, args...) fun(fmt, ##args)
又假設你希望巨集能夠自動加上換行符,那麼可以這樣寫:
#definefun(fmt, args...) fun(fmt"/n", ##args)
#define fun(fmt, ...) fun(fmt, __va_args__)
如果因為引數的個數為零導致編譯錯誤,可在前面加##
ok,那麼函式定義的問題我們就解決啦,但是怎麼來解呢?
c裡面提供了va_start,va_arg,va_end這樣幾個函式,解釋如下:
va_start使argp指向第乙個可選引數。va_arg返回引數列表中的當前引數並使argp指向引數列表中的下乙個引數。va_end把argp指標清為null。函式體內可以多次遍歷這些引數,但是都必須以va_start開始,並以va_end結尾。
可能只是這樣說並不是很清楚,我們舉個例子。
1、假設我們現在想要fun實現和printf一樣的功能,那麼實際上,我們是不需要把所有解析出來的,我們只有把引數原樣傳給printf即可,**如下:
voidfun(constchar* fmt,...)
2、假設我們現在是要將傳入的引數都取出來,那麼我們就要用到va_arg了,**如下:
voidfun(constchar* fmt,...)
其實到這裡大家也就不難發現,我們如何能遍歷所有的引數了,只要規定好最後乙個引數為乙個特殊字元,比如說-1,然後判斷到這個值就停止就行
voidfun(constchar* fmt,...)
while(value!=-1);
va_end(ap);//將ap置為null
}ok,到此為止,可變引數的函式編寫應該也就很明了啦~
C C 實現多引數函式程式設計
在c c 中,我們經常會需要實現類似printf這樣的函式,即函式的引數個數是不定的,這個時候就需要用到我們這篇文章講到的方法啦。首先,我們要知道這種函式,如何來定義。比如我想實現乙個函式能夠支援 fun d 1 那麼這個函式的定義實際上如下 voidfun const char fmt,其中 的意...
C C 函式變長引數列表實現
在c編譯器通常提供了一系列處理可變引數的巨集,實現就像printf 那樣的變長引數列表,這樣可以遮蔽不同的硬體平台造成的差異,增加程式的可移植性。這些巨集包括va start va arg和va end等,這些巨集都是在標頭檔案裡定義的。採用ansi標準形式時,引數個數可變的函式的原型宣告是 typ...
C C 中可變引數函式的實現
在c語言的stdarg.h標頭檔案中提供了三個函式va start,va end,va arg和乙個型別va list。利用它們,我們可以很容易實現乙個可變引數的函式。首先簡單介紹一下這三個函式。假設現在有乙個名為f的函式,其函式定義為 void f int a,int b,那麼,在函式的內部,為了...