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()函数时容易出错,可变参数的使用有利也有弊,所以在不必要的场合,我们无需用到可变参数.
相关文章推荐
- C语言-可变参数列表的解析
- 全面解析C语言中可变参数列表
- C语言中可变参数列表解析
- 解析c语言中可变参数列表
- C语言_可变参数列表解析
- C语言中的可变参数宏/函数,及可变参数在函数中的传递问题全解析
- C语言 可变参数
- [转]C语言中可变参数的用法
- C语言可变参数的使用
- C语言之可变参数列表
- C语言 内存分配 地址 指针 数组 参数 实例解析
- C语言中可变参数函数实现原理
- C语言-11-可变参数的实现方案
- C语言中实现可变参数函数
- C语言里的可变参数
- C语言(函数传递可变长度的参数列表)va_arg
- C语言可变长参数函数与默认参数提升
- C语言~对可变参数列表的简单理解
- C语言之可变参数
- C语言中的可变参数