變長參數的函數及宏

來源:互聯網
上載者:User

函數

#include <string.h>#include<stdarg.h>int max(int num, int b...){    va_list ap;       //A        int maxf,temp;    va_start(ap,b);//B        maxf=b;    cout <<b <<endl;    for(int i=1;i<num;i++) {      temp=va_arg(ap,int);       //C             cout<<temp<<'\n';      if(maxf<temp)         maxf=temp;   }   va_end(ap);            //D      return maxf;
}void string_var(char * str, ...) { strcmp("1", "2"); va_list vargs; char *strValue = str; int nArgCount = 0; va_start(vargs, str); do { cout << "Count:" << nArgCount << " strValue:" << strValue << endl; strValue = va_arg(vargs, char *); strcmp("1", "2"); if (sizeof(strValue) == 0) break; ++nArgCount; } while (1); va_end(vargs);}

 

#define MAX(num,...)\    max(num,__VA_ARGS__);

 

調用

cout << max(3, 11, 22, 44) << endl;cout << MAX(3, 11, 22, 44);string_var("abd", "dffd", "xxx");

相關宏

void va_start ( va_list arg_ptr, prev_param ); /* ANSI version */type va_arg ( va_list arg_ptr, type ); 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宏我們可以取得可變參數表的首指標,這個宏的定義為:

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

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

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

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

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

而va_end宏被用來結束可變參數的擷取,其定義為:

#define va_end ( list )

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.