c语言可变参数编程

来源:互联网 发布:佛山cnc编程招聘 编辑:程序博客网 时间:2024/04/26 19:41

---------------------------------------------我是分割线------------------------------------
<strong>INTSIZEOF</strong> 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) VA_END宏,清空va_list可变参数列表:#define va_end(ap) ( ap = (va_list)0 )




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 )

定义_INTSIZEOF(n)主要是为了某些需要内存的对齐的系统.C语言的函 数是从右向左压入堆栈的,这里的int必须是4的整数倍,内存对齐才有效。在实际使用的时候,必须自己定义最后结束的参数,不然程序只能返回下一个参数地址,然后强制转换成需要的类型,偏移对应的长度。

#include <stdarg.h>
#define MAXARGS 31
/*
* execl is called by
* execl(file, arg1, arg2, ..., (char *)(0));
*/
int execl(const char *file, const char *args, ...)
{
    va_list ap;
    char *array[MAXARGS +1];
    int argno = 0;
     
    va_start(ap, args);
    while (args != 0 && argno < MAXARGS)
    {
        array[argno++] = args;
        args = va_arg(ap, const char *);
    }
    array[argno] = (char *) 0;
     
    va_end(ap);
    return 
    execv(file, array);
}

---------------------------------------------我是分割线------------------------------------

vsprintf 函数定义如下:

int vsprintf(char *string, char *format, va_list param);

vsprintf 是sprintf 的一个变形,它只有三个参数。vsprintf 用于执行有不定数量参数的函数,类似printf 格式。vsprintf的前两个参数与sprintf相同:一个用于保存结果的字符串缓冲区和一个格式化字符串。第三个参数是指向格式化参数队列的指针。实际上,该指针指向在堆栈中供函数调用的变量。va_list、va_start和va_end宏(在STDARG.H中定义)帮助我们处理堆栈指针。本章最后的SCRNSIZE程式展示了使用这些宏的方法。使用vsprintf 函数,sprintf 函数可以这样编写:


int sprintf (char * szBuffer, const char * szFormat, ...)
{
int     iReturn ;
va_list pArgs ;
va_start (pArgs, szFormat) ;
iReturn = vsprintf (szBuffer, szFormat, pArgs) ;
va_end (pArgs) ;
return iReturn ;
}



0 0