成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++可變參數表基本內容探討

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

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

 

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

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

 

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

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

本文將對C++可變參數表的使用方法及C/C++支持可變參數表的深層機理進行探索。

C++可變參數表的用法

1、相關宏

標準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(可變參數)的意思;arg_ptr是指向可變參數表的指針;prev_param則指可變參數表的前一個固定參數;type為可變參數的類型。va_list也是一個宏,其定義為typedef char * va_list,實質上是一char型指針。char型指針的特點是++、--操作對其作用的結果是增1和減1(因為sizeof(char)為1),與之不同的是int等其它類型指針的++、--操作對其作用的結果是增sizeof(type)或減sizeof(type),而且sizeof(type)大于1。

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

 

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

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

 

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

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

 

  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宏被用來結束C++可變參數表的獲取,其定義為:

 

  1. #define va_end ( list )  

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

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

2、一個簡單的例子

 

  1. #include <stdarg.h> 
  2. /* 函數名:max  
  3. * 功能:返回n個整數中的最大值  
  4. * 參數:num:整數的個數 ...:num個輸入的整數  
  5. * 返回值:求得的最大整數  
  6. */  
  7. int max ( int num, ... )  
  8. {  
  9. int m = -0x7FFFFFFF; /* 32系統中最小的整數 */  
  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. /* 主函數調用max */  
  24. int main ( int argc, char* argv[] )  
  25. {   
  26. int n = max ( 5, 5, 6 ,3 ,8 ,5); /* 求5個整數中的最大值 */  
  27. cout << n;  
  28. return 0;  
  29. }  

 

函數max中首先定義了C++可變參數表指針ap,而后通過va_start ( ap, num )取得了參數表首地址(賦給了ap),其后的for循環則用來遍歷可變參數表。這種遍歷方式與我們在數據結構教材中經常看到的遍歷方式是類似的。#t#

函數max看起來簡潔明了,但是實際上printf的實現卻遠比這復雜。max函數之所以看起來簡單,是因為:

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

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

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

責任編輯:曹凱 來源: 博客園
相關推薦

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++虛析構函數

2010-01-04 15:21:37

Silverlight

2009-09-10 10:47:05

C# form

2010-01-28 15:33:37

Android程序架構

2010-04-22 09:36:56

Oracle數據字典

2010-02-25 15:49:05

WCF消息模式

2010-03-02 15:53:02

WCF服務合同

2017-10-25 06:50:27

數據科學數據數據分析

2010-02-25 17:51:04

WCF服務地址

2010-03-05 11:53:20

Python命名約定

2010-02-04 13:39:44

C++數組參數

2012-09-18 13:26:39

CC++

2010-03-02 17:55:37

WCF終結點地址

2010-03-03 15:26:54

Python編碼規范

2010-02-25 17:04:54

WCF實例上下文

2010-05-11 14:19:52

MySQL 5.0
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合久 | 亚洲高清视频在线观看 | 国产精品视频二区三区 | 色视频成人在线观看免 | 在线观看av不卡 | 久久av一区 | 日本久草| 欧美日韩亚洲系列 | 精品国产91乱码一区二区三区 | 黄色三级免费 | 欧美区日韩区 | 成人深夜小视频 | 精品国产三级 | 国产精品免费一区二区三区四区 | 欧美一区二区三区免费在线观看 | 国产三级在线观看播放 | 日韩一区二区三区在线视频 | 国产亚洲精品久久久久久牛牛 | 黄色一级特级片 | 在线午夜电影 | 五月天综合网 | 欧美激情一区二区三级高清视频 | 欧美一级片a| 成人综合视频在线 | 中国人pornoxxx麻豆 | 日一区二区 | 天天躁日日躁狠狠很躁 | 久久伊人精品 | 成人h动漫精品一区二区器材 | 亚洲精品一区二三区不卡 | 丁香婷婷成人 | 日韩在线第一 | 成人av在线播放 | 日韩和的一区二在线 | 国产欧美性成人精品午夜 | 精品久久香蕉国产线看观看亚洲 | 一区二区不卡视频 | 日韩毛片中文字幕 | 91精品久久久久久久久中文字幕 | 久产久精国产品 | 影音先锋中文在线 |