C语言可变参数解析

来源:互联网 发布:阿里云 自定义端口 编辑:程序博客网 时间:2024/06/03 15:01

C语言可变参数解析 

      C语言中有许多函数的参数个数是可变的,例如printf函数,它有printf("%d",a),printf("%d%d",a,b)等等,它的定义是这样的: 
  int printf( const char* format, ...);
    它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法: 
  printf("%d",i); 
  printf("%s",s); 
  printf("the number is %d ,string is:%s", i, s);
    可变参数的个数如何控制?
    1.用指针指向可变参数
    2.用整型控制
    3.最后参数设置为空
    下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的C函数要在程序中用到以下这些宏: 
    void va_start( va_list arg_ptr, prev_param ); 
    type va_arg( va_list arg_ptr, type ); 
    void va_end( va_list arg_ptr );
    va在这里是可变参数的意思.这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.
    va_list相当于char*,va_start()函数的功能是将指针指向第一个可变参数,并赋值给arg_ptr指针,&pre_param提供指针的起始位置;
    可变函数可以以va_list arg_ptr语句开始,va_end(arg_ptr)语句结束;
    va_arg()函数取出当前arg_ptr所指向的内存单元的值后,并使arg_ptr指向下一个参数即移动sizeof(type)个字节;
    具体函数如何实现涉及到函数调用栈等方面的知识就不详细介绍啦,只说明函数执行后的结果!
    一个小例题如下:
    
#include <stdio.h>#include <stdarg.h>void printlist(int begin,...){        va_list arg_ptr;        char *p;        va_start(arg_ptr,begin);        p=va_arg(arg_ptr,char*);        while(p!=NULL){                fputs(p,stdout);                putchar('\n');                p=va_arg(arg_ptr,char*);        }        va_end(arg_ptr);}int main(void){        printlist(0,"hello","linux","c",NULL);        return 0;}
    可变参数的函数原理其实很简单,va系列用宏定义来定义,实现跟栈相关,但调用arg_arg()函数时容易出错,可变参数的使用有利也有弊,所以在不必要的场合,我们无需用到可变参数.