C C 實現多引數函式程式設計

2021-06-20 23:04:20 字數 1342 閱讀 3149

在c/c++中,我們經常會需要實現類似printf這樣的函式,即函式的引數個數是不定的,這個時候就需要用到我們這篇文章講到的方法啦。

首先,我們要知道這種函式,如何來定義。比如我想實現乙個函式能夠支援 fun(」%d」,1);

那麼這個函式的定義實際上如下:

voidfun(const

char*fmt, …);

其中…的意思是說引數無法一一列出,所以用…代替,至於怎麼解,我們稍後再說。

比較特殊的一點是,如果你希望將上面的函式定義成乙個巨集,那麼這個巨集可以這樣寫:

#definefun(fmt, args…) fun(fmt,##args)

又假設你希望巨集能夠自動加上換行符,那麼可以這樣寫:

#definefun(fmt, args…) fun(fmt「\n」, ##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 constchar 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,那麼,在函式的內部,為了...