变参数的解决方法,使用stdarg中的VA宏

void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
typedef char * va_list;

具体的宏定义如下:

#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )

代码以C++为例。

其中,-0X7fffffff是最小的long int 整数,是因为long int 是4 byte,即32bit,8个十六进制的数组成。(7)H= (0111)B,
最高位是符号位。
note: n是用来限制边界的;
v_list:定义了一个v_list类型的变量
v_start:初始化变量,并使得变量指向下一个参数
v_end:结束变量

#include              
#include 
#include              //statement va_list

using namespace std;

int max(int n, ... );

void main()
{
    cout<< max (3,10,20,30) <6,20,40,100,50,30,40) <... )           //note: use n to limit the border,... is the last parameter
{
    int temp,i;
    int max = -0X7fffffff;      //the min integer

    va_list ap;                 //define a point of va_list
    va_start( ap, n );          //initialize ap,make ap point to the first parameter

    for( i = 0; i < n; i++)
    {
        temp = va_arg( ap, int );//get a parameter of int, and the ap ponit to the next parameter
        if( max < temp ) max = temp;
    }
    va_end(ap);
    return max;
}

#获取不同格式的变量、字符放入一个字符串
#按照格式要求输出字符串

/** 
 *  @brief 获取格式化输出字符串
 *  @param *format 格式化输出字符串
 *  @retval str 
 */
#include 
#include 

#define bufsize 80
char buffer[bufsize];

int vsnf(char *format, ... );

void main()
{
    int inum = 30 ;
    float fnum = 90.0;
    char string[4] = "abc";
    vsnf("%d\n%f\n%s",inum,fnum,string);
    printf("%s\n",buffer);
}

int vsnf(char *format, ... )
{
    int string;

    va_list ap;
    va_start(ap,format);

/*vsnprintf(char *, size_t, const char *, va_list);*/
    string = _vsnprintf(buffer,bufsize,format,ap);

    va_end(ap);

    return string;
}

你可能感兴趣的:(CPlusPlus)