自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++可變參數(shù)表基本內(nèi)容探討

開發(fā) 后端
C++可變參數(shù)表的使用方法及一些基本概念將會在這篇文章中詳細(xì)介紹。大家可以通過對這里內(nèi)容的解讀充分掌握這方面的知識。

C++編程語言可以被看做C語言的一個升級版本。既然是基于C語言的一個編程語言,當(dāng)然具有C語言中的所有功能。那么還有那些不同之處呢?其中就有一個不同于其它語言的特性,即其支持C++可變參數(shù)表,典型的函數(shù)如printf、scanf等可以接受數(shù)量不定的參數(shù)。如:

 

  1. printf ( "I love you" );   
  2. printf ( "%d", a );  
  3. printf ( "%d,%d", a, b );  

第一、二、三個printf分別接受1、2、3個參數(shù),讓我們看看printf函數(shù)的原型:

 

  1. int printf ( const char *format, ... );  

從函數(shù)原型可以看出,其除了接收一個固定的參數(shù)format以外,后面的參數(shù)用"…"表示。在C/C++語言中,"…"表示可以接受不定數(shù)量的參數(shù),理論上來講,可以是0或0以上的n個參數(shù)。

本文將對C++可變參數(shù)表的使用方法及C/C++支持可變參數(shù)表的深層機(jī)理進(jìn)行探索。

C++可變參數(shù)表的用法

1、相關(guān)宏

標(biāo)準(zhǔn)C/C++包含頭文件stdarg.h,該頭文件中定義了如下三個宏:

 

  1. void va_start ( va_list arg_ptr, prev_param ); /* ANSI version */  
  2. type va_arg ( va_list arg_ptr, type );   
  3. void va_end ( va_list arg_ptr );  

在這些宏中,va就是variable argument(可變參數(shù))的意思;arg_ptr是指向可變參數(shù)表的指針;prev_param則指可變參數(shù)表的前一個固定參數(shù);type為可變參數(shù)的類型。va_list也是一個宏,其定義為typedef char * va_list,實(shí)質(zhì)上是一char型指針。char型指針的特點(diǎn)是++、--操作對其作用的結(jié)果是增1和減1(因?yàn)閟izeof(char)為1),與之不同的是int等其它類型指針的++、--操作對其作用的結(jié)果是增sizeof(type)或減sizeof(type),而且sizeof(type)大于1。

通過va_start宏我們可以取得C++可變參數(shù)表的首指針,這個宏的定義為:

 

  1. #define va_start ( ap, v ) ( ap = (va_list)&v + _INTSIZEOF(v) )  

顯而易見,其含義為將最后那個固定參數(shù)的地址加上可變參數(shù)對其的偏移后賦值給ap,這樣ap就是可變參數(shù)表的首地址。其中的_INTSIZEOF宏定義為:

 

  1. #define _INTSIZEOF(n) ((sizeof ( n ) + sizeof ( int ) - 1 )
     & ~( sizeof( int ) - 1 ) )  

va_arg宏的意思則指取出當(dāng)前arg_ptr所指的可變參數(shù)并將ap指針指向下一可變參數(shù),其原型為:

 

  1. #define va_arg(list, mode) ((mode *)(list =\  
  2. (char *) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) &\  
  3. (__builtin_alignof(mode)<=4?-4:-8))+sizeof(mode))))[-1]  

 

對這個宏的具體含義我們將在后面深入討論。

而va_end宏被用來結(jié)束C++可變參數(shù)表的獲取,其定義為:

 

  1. #define va_end ( list )  

可以看出,va_end ( list )實(shí)際上被定義為空,沒有任何真實(shí)對應(yīng)的代碼,用于代碼對稱,與va_start對應(yīng);另外,它還可能發(fā)揮代碼的"自注釋"作用。所謂代碼的"自注釋",指的是代碼能自己注釋自己。

下面我們以具體的例子來說明以上三個宏的使用方法。

2、一個簡單的例子

 

  1. #include <stdarg.h> 
  2. /* 函數(shù)名:max  
  3. * 功能:返回n個整數(shù)中的最大值  
  4. * 參數(shù):num:整數(shù)的個數(shù) ...:num個輸入的整數(shù)  
  5. * 返回值:求得的最大整數(shù)  
  6. */  
  7. int max ( int num, ... )  
  8. {  
  9. int m = -0x7FFFFFFF; /* 32系統(tǒng)中最小的整數(shù) */  
  10. va_list ap;  
  11. va_start ( ap, num );  
  12. for ( int i0; i< num; i++ )  
  13. {  
  14. int t = va_arg (ap, int);  
  15. if ( t > m )  
  16. {  
  17. m = t;  
  18. }  
  19. }  
  20. va_end (ap);  
  21. return m;  
  22. }   
  23. /* 主函數(shù)調(diào)用max */  
  24. int main ( int argc, char* argv[] )  
  25. {   
  26. int n = max ( 5, 5, 6 ,3 ,8 ,5); /* 求5個整數(shù)中的最大值 */  
  27. cout << n;  
  28. return 0;  
  29. }  

 

函數(shù)max中首先定義了C++可變參數(shù)表指針ap,而后通過va_start ( ap, num )取得了參數(shù)表首地址(賦給了ap),其后的for循環(huán)則用來遍歷可變參數(shù)表。這種遍歷方式與我們在數(shù)據(jù)結(jié)構(gòu)教材中經(jīng)??吹降谋闅v方式是類似的。#t#

函數(shù)max看起來簡潔明了,但是實(shí)際上printf的實(shí)現(xiàn)卻遠(yuǎn)比這復(fù)雜。max函數(shù)之所以看起來簡單,是因?yàn)椋?/p>

(1) max函數(shù)可變參數(shù)表的長度是已知的,通過num參數(shù)傳入;

(2) max函數(shù)可變參數(shù)表中參數(shù)的類型是已知的,都為int型。

而printf函數(shù)則沒有這么幸運(yùn)。首先,printf函數(shù)可變參數(shù)的個數(shù)不能輕易的得到,而可變參數(shù)的類型也不是固定的,需由格式字符串進(jìn)行識別(由%f、%d、%s等確定),因此則涉及到C++可變參數(shù)表的更復(fù)雜應(yīng)用。

責(zé)任編輯:曹凱 來源: 博客園
相關(guān)推薦

2010-02-05 10:08:55

C++名字空間

2010-02-06 13:58:13

C++ Bost庫

2010-02-04 15:51:07

C++迭代器

2010-02-02 15:12:09

C++ explici

2010-02-05 13:35:19

C++虛析構(gòu)函數(shù)

2010-01-04 15:21:37

Silverlight

2009-09-10 10:47:05

C# form

2010-04-22 09:36:56

Oracle數(shù)據(jù)字典

2010-01-28 15:33:37

Android程序架構(gòu)

2010-03-02 15:53:02

WCF服務(wù)合同

2010-03-05 11:53:20

Python命名約定

2010-02-25 15:49:05

WCF消息模式

2010-02-25 17:51:04

WCF服務(wù)地址

2017-10-25 06:50:27

數(shù)據(jù)科學(xué)數(shù)據(jù)數(shù)據(jù)分析

2010-02-04 13:39:44

C++數(shù)組參數(shù)

2012-09-18 13:26:39

CC++

2010-03-02 17:55:37

WCF終結(jié)點(diǎn)地址

2010-03-03 15:26:54

Python編碼規(guī)范

2010-02-25 17:04:54

WCF實(shí)例上下文

2010-05-11 14:19:52

MySQL 5.0
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號