C语言中函数可变参数解析
大多數(shù)時(shí)候,函數(shù)中形式參數(shù)的數(shù)目通常是確定的,在調(diào)用時(shí)要依次給出與形式參數(shù)對應(yīng)的所有實(shí)際參數(shù)。但在某些情況下希望函數(shù)的參數(shù)個數(shù)可以根據(jù)需要確定。典型的例子有
大家熟悉的函數(shù)printf()、scanf()
可變參數(shù)的實(shí)現(xiàn):
C語言頭文件stdarg.h提供了一個數(shù)據(jù)類型va-list和三個宏(va-start、va-arg和va-end),va—start使vp指向第一個可選參數(shù)。va—arg返回參數(shù)列表中的當(dāng)前參數(shù)并使vp指向參數(shù)列表中的下一個參數(shù)。va
?
—end把vp指針清為NULL。函數(shù)體內(nèi)可以多次遍歷這些參數(shù),但是都必須以va—start開始,并以va—end結(jié)尾。用它們在被調(diào)用函數(shù)不知道參數(shù)個數(shù)和類型時(shí)對可變參數(shù)表進(jìn)行測試,從而為訪問可變參數(shù)提供
?
了方便且有效的方法。va-list是一個char類型的指針,當(dāng)被調(diào)用函數(shù)使用一個可變參數(shù)時(shí),它聲明一個類型為va-list的變量,該變量用來指向va-arg和va-end所需信息的位置。
?
下面給出va_list在C中的源碼:
?typedef char * va_list;?
采用ANSI標(biāo)準(zhǔn)形式時(shí),參數(shù)個數(shù)可變的函數(shù)的原型聲明是:
? type funcname(type para1, type para2, ...)?
這種形式至少需要一個普通的形式參數(shù),后面的省略號不表示省略,而是函數(shù)原型的一部分,type是函數(shù)返回值和形式參數(shù)的類型。
?
調(diào)用者在實(shí)際調(diào)用參數(shù)個數(shù)可變的函數(shù)時(shí),要通過一定的方法指明實(shí)際參數(shù)的個數(shù),例如把最后一個參數(shù)置為空字符串。
下面給出一個具體的例子:
求n個數(shù)的和:
int Sum(int n,...) {int i = 0,sum = 0;va_list vp; va_start(vp,n); //va—start使vp指向第一個可選參數(shù)for (i=0; i<n; i++){sum +=va_arg(vp,int); }va_end(vp); //va—end把vp指針清為NULL。return sum; }printf函數(shù)實(shí)現(xiàn):(此處只實(shí)現(xiàn)了基本類型的打印)
1 void my_print(const char *format,...)2 {3 char c = 0;4 va_list vp; 5 va_start(vp,format); //vp指向第一個可選參數(shù)6 while (*format)7 {8 c = *format;9 switch (c) 10 { 11 case '%': 12 { 13 char cc = *(++format); 14 switch (cc) 15 { 16 case 'd': 17 { 18 char str[50]; 19 int n = va_arg(vp,int); //va—arg返回參數(shù)列表中的當(dāng)前參數(shù)并使vp指向參數(shù)列表中的下一個參數(shù)。 20 char *string = _itoa(n,str,10); //把整數(shù)轉(zhuǎn)為字符串 21 print_str(string); 22 } 23 break; 24 case 'f': 25 { 26 char str[50]; 27 double f = va_arg(vp,double);//va—arg返回參數(shù)列表中的當(dāng)前參數(shù)并使vp指向參數(shù)列表中的下一個參數(shù) 28 char *string = _gcvt(f,10,str);//將浮點(diǎn)型數(shù)轉(zhuǎn)換為字符串,取四舍五入 29 print_str(string); 30 } 31 break; 32 case 'c': 33 putchar(va_arg(vp,char)); 34 break; 35 case 's': 36 { 37 char *string = va_arg(vp,char*); 38 print_str(string); 39 } 40 break; 41 default: 42 break; 43 } 44 } 45 break; 46 default: 47 putchar(c); 48 break; 49 } 50 format++; 51 } 52 va_end(vp); 53 }理解可變參數(shù)很重要的是要理解函數(shù)棧幀的創(chuàng)建與銷毀,里面涉及到參數(shù)是如何壓棧,這方面內(nèi)容在前面的博客:http://www.cnblogs.com/zhonglongbo/p/8392026.html
總結(jié)
以上是生活随笔為你收集整理的C语言中函数可变参数解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下unlink函数的使用
- 下一篇: 回调函数到底是怎么一回事呢