• 10509阅读
  • 3回复

【原创】可变参数函数的使用 [复制链接]

上一主题 下一主题
离线fanyu
 
只看楼主 倒序阅读 楼主  发表于: 2005-11-22
//以下代码已通过MingW 3.3.2
#include "stdio.h"
#include "stdarg.h"
#include "iostream.h"
void simple_va_fun(int start, ...)
{
va_list arg_ptr;
int nArgValue =start;
int nArgCout=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);//以-1为作参数输入的结束符
return;
}
int main(int argc, char* argv[])
{
simple_va_fun(100,'a','s',-1);
cout<<"-------------------------------\n";
simple_va_fun(100,200,30,230,-1);
return 0;
}
离线pinkscut
只看该作者 1楼 发表于: 2005-11-22
va_list 这些可不可以讲清楚一点呢?虽然大概知道是内存里面的一个结构之类的。
^_^
离线fanyu
只看该作者 2楼 发表于: 2005-11-23
va_list是这样定义的
typedef __gnuc_va_list va_list;
显然__gnuc_va_list是GCC编译器的一个内置类型。
别外几个东西的定义
#define va_start(v,l)      __builtin_va_start(v,l)
#define va_end(v)      __builtin_va_end(v)
#define va_arg(v,l)      __builtin_va_arg(v,l)
上述三个它们都是宏定义,即在编译后产生的,利用函数栈得到相关的地址位置。

这种方法和printf的实现是一样的,都是在编译期间产生。
不同编译于对于stdarg.h的实现是不一样的。
离线wbyqy

只看该作者 3楼 发表于: 2009-05-06
快速回复
限100 字节
 
上一个 下一个