C語言可變引數的實現機制

2021-06-25 10:04:02 字數 1422 閱讀 5312



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 );

va_list:用來儲存巨集va_start、va_arg和va_end所需資訊的一種型別。為了訪問變長引數列表中的引數,必須宣告

va_list型別的乙個物件       定義: typedef char *  va_list;

va_start:訪問變長引數列表中的引數之前使用的巨集,它初始化用va_list宣告的物件,初始化結果供巨集va_arg和

va_end使用;

va_arg: 展開成乙個表示式的巨集,該表示式具有變長引數列表中下乙個引數的值和型別。每次呼叫va_arg都會修改

用va_list宣告的物件,從而使該物件指向引數列表中的下乙個引數;

va_end:該巨集使程式能夠從變長引數列表用巨集va_start引用的函式中正常返回。

va在這裡是variable-argument(可變引數)的意思.

這些巨集定義在stdarg.h中,所以用到可變引數的程式應該包含這個標頭檔案.

#include ;  

#include ;

#include ;

/* ansi標準形式的宣告方式,括號內的省略號表示可選引數 */

int demo(char *msg, ... )

va_end( argp ); /* 將argp置為null */

return 0;

}void main( void )

從這個函式的實現可以看到,我們使用可變引數應該有以下步驟: 

1)首先在函式裡定義乙個va_list型的變數,這裡是arg_ptr,這個變 

量是指向引數的指標. 

2)然後用va_start巨集初始化變數arg_ptr,這個巨集的第二個引數是第 

乙個可變引數的前乙個引數,是乙個固定的引數. 

3)然後用va_arg返回可變的引數,並賦值給整數j. va_arg的第二個 

引數是你要返回的引數的型別,這裡是int型. 

4)最後用va_end巨集結束可變引數的獲取.然後你就可以在函式裡使 

用第二個引數了.如果函式有多個可變引數的,依次呼叫va_arg獲 

取各個引數. 

2.存在的陷阱:va_arg巨集的第2個引數不能被指定為char、short或者float型別。在c語言中,呼叫乙個不帶原型宣告的函式時,呼叫者會對每個引數執行「預設實際引數提公升(default argument promotions)」。

**:

C語言可變引數實現

第一 什麼是可變引數 int printf const char format,看到printf的定義大家就知道了,只有乙個固定的const char 引數,後面的都是不定長的引數列表了。第二 自己寫乙個可變引數函式 1.引數形參方式,跟printf類似,第乙個為固定引數,後面的用.代替 2.包含s...

C語言怎麼實現可變引數?

摘要 c語言使用可變引數,需要借助巨集。這些巨集定義在stdarg.件。stdarg.h宣告了乙個型別va list和三個巨集va start,va arg,va end。include va list v arg 定義乙個型別 va start v arg,len 引數列表初始化 va arg v...

c語言可變引數實現示例

這段 展示了如何不使用中的va list va start va end巨集來實現自定www.cppcns.com義可變引數以及如何改變預設的 d f s等格式字元。複製 如下 include include itoa and ltoa include strcat and strlen echo ...