可变参数

来源:互联网 发布:中搜网络到底怎么了 编辑:程序博客网 时间:2024/05/29 12:40
摘自网络的 C语言网络参数的用法
C语言中会遇到一些参数可变的函数,例如printf(),函数原型为
int printf(const char * format,...);
 函数编辑器。
 
  首先编写一个简单的可变参数的C函数
    该函数至少有一个整数参数,其后是占位符...,表示后面的参数不固定,例子中的输入参数必须是整型
用来打印所有的参数。
#include "stdio.h"
#include "stdarg.h"
void simple_va_fun(int start,...)
{
va_list arg_ptr;
int nArgValue = start;
int nArgCount = 0;// 可变参数的数目
va_start(arg_ptr,start);// 以固定参数的地址为起点确定变参的内存起始地址。
do
{
++nArgCout;
printf("the %d th arg: %d\n",nArgCout,nArgValue);
nArgValue = va_arg(arg_ptr,int); //得到下一个可变参数的值
}while(nArgValue != -1)
return 0;
}
int mian(int argc,char* argv[])
{
simple_va_fun(100,-1);
simple_va_fun(100,200,-1);
return 0;
}
使用可变参数有以下的步骤
(1)在程序中使用以下宏
void va_start (va_list,arg_ptr,prev_param);
void va_arg(va_list arg_ptr,type);
void va_end(va_list arg_ptr);

va是指variable-argument(可变参数)的意思
va_start va_arg va_end 是在stdarg.h中以宏的形式实现的,由于硬件平台的不同,宏的定义
与实现也是不同的。
typedef char *va_list
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))
#define va_list(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 )

0 0