在定义可变參数的函数之前,先来理解一下函数參数的传递原理:1、函数參数是以栈这样的数据结构来存取的,在函数參数列表中,从右至左依次入栈。2、參数的内存存放格式:參数的内存地址存放在内存的堆栈段中,在运行函数的时候,从最后一个(最右边)參数開始入栈。因此栈底高地址,栈顶低地址,举个样例说明一下:voi...
分类:
编程语言 时间:
2015-02-28 20:08:41
阅读次数:
182
定义参数个数不确定的函数,需用到头文件stdarg.h,该头文件是专门为变长参数函数所用。
参数变长函数的声明:void function(int intVal, ...),当然参数类型可以为double或其他,返回类型也可以自己修改。
方法:
先用头文件stdarg.h中的宏va_list定义一个指向参数的指针ap,va_list ap;
再用宏va_start初始化指针ap,va_st...
分类:
其他好文 时间:
2015-02-09 14:11:38
阅读次数:
165
printf 老是需要需要打 \n 于是有了这个需求: 只对 不知道 ?vprintf 存在的朋友 有用; ------------------正文--------------- #include <stdarg.h> void clprt(char* fmt,...){ va_list vas; va_start(vas,fm...
分类:
其他好文 时间:
2015-02-07 17:37:33
阅读次数:
136
函数 printf的正确声明形式为:int printf(char *fmt, ...)其中,省略号表示参数表中参数的数量和类型是可变的。va_list 类型用于声明一个变量,该变量将依次引用各参数。宏va_start将ap初始化为指向第一个无名参数的指针。在使用ap 之前,该宏必须被调用一次。参数...
分类:
其他好文 时间:
2015-02-04 21:34:13
阅读次数:
149
#include
//#include
//#include
//int sum(int n, ...);
typedef void* va_list;
#define _INTSIZEOF(arg) ((sizeof(arg) + sizeof(int) - 1)&(~(sizeof(int) - 1))) //字节对齐,针对32位系统
#define va_start(arg,...
分类:
其他好文 时间:
2015-01-31 21:55:54
阅读次数:
159
在C语言的stdarg.h头文件中提供了三个函数va_start, va_end,va_arg和一个类型va_list。利用它们,我们可以很容易实现一个可变参数的函数。首先简单介绍一下这三个函数。假设现在有一个名为f的函数,其函数定义为:void f(int a, int b, ...)那么,在函数...
分类:
编程语言 时间:
2015-01-23 12:45:19
阅读次数:
200
链接:va_list百科1:概述VA_LIST 是在c语言中解决变参问题的一组宏,所在头文件:#include 2:成员#ifdef _M_ALPHAtypedef struct {char *a0; /* pointer to first homed integer argument */int ...
分类:
其他好文 时间:
2015-01-21 21:53:42
阅读次数:
143
函数参数的传递原理
函数参数在内存中是以栈的形式存取,从右至左入栈。
参数在内存中存放格式:
在进程中,堆栈地址是从高到低分配的。当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减。
总之,函数在堆栈中的分布情况是,地址从高到低,依次是:函数参数列表,函数返回地址,函数执...
分类:
编程语言 时间:
2015-01-21 15:13:50
阅读次数:
235
std::string stringf(const char* format, ...){ va_list arg_list; va_start(arg_list, format); ...
分类:
其他好文 时间:
2015-01-19 10:45:14
阅读次数:
97
可变参数给编程带来了很大的方便,在享受它带来的方便的同时,很有必要了解一下其实现方式,在了解编程语言的同时,也可以扩展编程的思路。可变参数需要用到3个宏函数和一个类型,他们都定义在中,分别是:va_start(vl)va_arg(vl, type)va_end(vl)其中vl是va_list类型,t...
分类:
编程语言 时间:
2015-01-19 00:03:35
阅读次数:
326