您的位置:首页 > 编程语言 > C语言/C++

C语言可变参数解析

2013-08-10 10:47 246 查看

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()函数时容易出错,可变参数的使用有利也有弊,所以在不必要的场合,我们无需用到可变参数.
    
    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux C 可变参数 函数