函數
#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宏被用來結束可變參數的擷取,其定義為:
可以看出,va_end ( list )實際上被定義為空白,沒有任何真實對應的代碼,用於代碼對稱,與va_start對應;另外,它還可能發揮代碼的"自注釋"作用。所謂代碼的"自注釋",指的是代碼能自己注釋自己。