快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记娱专业h88285:C++函数的可变参数详谈



可变参数的英文表示为:variable argument.

它在函数的定义时,用三个点号'.'表示,用逗号与其它参数分隔.

可变参数的特征:不像固定参数那样逐一对应,也不像固定参数有固定的参数类型和参数名称;可变参数中个数不

定可是传入的是一个参数也可所以多个;可变参数中的每个参数的类型可以不合,也可以相同;可变参数的每个参数并没有

实际的名称与之相对应.

由此可见,可变参数的形式异常自由而富有弹生.因些,它给那些天才法度榜样员有更大年夜地想象和发挥空间.

然而,更多地自由,同样也加大年夜操作上的难度.

以下就对可变参数的几个方面作必然的先容.

1)可变参数的存储形式.

大年夜家都知道,一样平常函数的形参属于局部变量.而局部变量便是存储在内存的栈区(所谓的栈区:由编译器自动分配开释,

寄放函数的参数值,局部变量的值等。其操作要领类似于数据布局中的栈。).可变参数也是存储在内存栈区.

在对函和记娱专业h88285数的形参存储的时侯,编译器是从函数的形参的右边到左边一一地压栈,

这样包管了栈顶是函数的形参的第一个参数(从左到右数).而80x86平台下的内存分配顺序是从高地址内存到低地址内存.

是以,函数的形参在内存的存储形式如下图(以fun(int var1,int var2,...,int var3,int var4)为例):

栈区:

|栈顶       低地址

|第一个固定参数var1

|可变参数前的第一个固定参数var2

|可变参数的第一个参数

|...

|可变参数的着末一个参数

|函数的倒数第二个固定参数var3

|函数的着末一个固定参数var4

|...

|函数的返回地址

|...

|栈底  高地址

2)应用可变参数所用到头文件和相关宏阐明

在此,以TC2.0编译器为参考工具来阐明.

可变参数的相关定义在TC2.0的名为"STDARG.H"的头文件中.

此文件为:

/* stdarg.h

Definitions for ACCESSing parameters in functions that accept

a variable number of arguments.

Copyright (c) Borland International 1987,1988

All Rights Reserved.

*/

#if __STDC__

#define _Cdecl

#else

#define _Cdecl cdecl

#endif

#if !defined(__STDARG)

#define __STDARG

typedef void *va_list;

#define va_start(ap, parmN) (ap = ...)

#define va_arg(ap, type) (*((type *)(ap))++)

#define va_end(ap)

#define _va_ptr  (...)

#endif

以上为"STDARG.H"的内容和记娱专业h88285.

该文件定义了应用可变参数所用到的数据类型:typedef vo和记娱专业h88285id *va_list;

va_start(ap,parmN)起到初始化,应用得ap指向可变参数的第一个参数.ap的类型为va_list,

parmN为可变参数的前面一个固定参数.

va_arg(ap,type)获适合前ap所指向的参数,并使ap指向可变参数的下一个参数,type为必要得到的参数的类型.

va_end(ap) 停止可变参数获取.

3)可变参数的应用实例

实例目的:用可变参数来实现个数不定的字符串的通报,并显示通报过来的字符串.

#include

#include

#include

void tVarArg(int num,...);/*num为可变参数的个数*/

int main(void)

{

clrscr();

tVarArg(5,"Hello! ","My ","name ","is ","neverTheSame.n");

tVarArg(8,"This ","is ","an ","example ","about ","variable-argument ","in ","funtion");

getch();

return 0;

}

void tVarArg(int num,...)

{

va_list argp; /*定义一个指向可变参数的变量*/

va_start(argp和记娱专业h88285,num); /*初始化,应用argp指向可变参数的第一个参数*/

while(--num>=0)

printf("%s",(va_arg(argp,char*)));/*va_arg(argp,char*)得到argp所指向的参数,

并应用argp指向下一个参数,char*应用所得到的参数的类型转换和记娱专业h88285为char*型.*/

va_end(argp); /*停止可变参数获取*/

return ;

}

4)可变参数的应用必要留意的问题

1.每个函数的可变参数至多有一个.

2.va_start(ap,parmN)中parmN为可变参数前的一个固定参数.

3.可变参数的个数不确定,完全由法度榜样约定.

4.可变参数的类型不确定,完全由va_arg(ap,type)中的type指定,然后就把参数的类型强制转换.

而printf()中不是实现了识别参数吗?那是由于函数

printf()是从固定参数format字符串来阐发出参数的类型,再调用va_arg

的来获取可变参数的.也便是说,你想实现智能识别可变参数的话是要通

过在自己的法度榜样里作判断来实现的.

5.编译器对可变参数的函数的原型反省不敷严格,对编程职员要求很高.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: