C++省略号参数.docx_第1页
C++省略号参数.docx_第2页
C++省略号参数.docx_第3页
C++省略号参数.docx_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+函数参数中的省略号用法分析 发布时间:2010.06.21 16:12 来源:赛迪网 作者:mt 【赛迪网讯】C+允许定义形参个数和类型不确定的函数。例如,C语言中的标准函数printf便使用这种机制。在声明不确定形参的函数时,形参部分可以使用省略号“”代替。“”告诉编译器,在函数调用时不检查形参类型是否与实参类型相同,也不检查参数个数。 例如:void ConnectData(int i,.) 在上面的代码中,编译器只检查第一个参数是否为整型,而不对其他参数进行检查。 对于可变参数的函数,需要进行特殊的处理。首先需要引用 头文件,然后利用va_list类型和va_start、va_arg、va_end 3个宏读取传递到函数中的参数值。 这几个宏的定义如下(在 ANSI C 中): type va_arg( va_list arg_ptr, type );void va_end( va_list arg_ptr );void va_start( va_list arg_ptr, prev_param ); 说明如下: va_start :sets arg_ptr to the first optional argument in the list of arguments passed to the function. The argument arg_ptr must have va_list type. The argument prev_param is the name of the required parameter immediately preceding the first optional argument in the argument list. If prev_param is declared with the register storage class, the macros behavior is undefined. va_start must be used before va_arg is used for the first time. 【 va_start函数将参数arg_ptr设置为可变参数列表的第一个参数。参数arg_ptr的类型必须为va_list。参数prev_param是在可变参数列表之前的那一个参数。(也就是说在 ANSI C 中,如果一个函数有可变参数,那么在该可变参数前必须有一个明确定义的参数,否则无法调用函数 va_start ,例如函数 int add(int i,.)是合法的,而函数 int add(.)是不合法的。)】 va_arg :retrieves a value of type from the location given by arg_ptr and increments arg_ptr to point to the next argument in the list, using the size of type to determine where the next argument starts. va_arg can be used any number of times within the function to retrieve arguments from the list. 【 va_arg函数将返回 arg_ptr 所指位置的值,并将 arg_ptr 指向下一个参数 】 va_end After all arguments have been retrieved, va_end resets the pointer to NULL. 示例代码: #include#includeusing namespace std;int add(int pre,.) /求和函数 va_list arg_ptr; int sum=0; int nArgValue; sum+=pre; va_start(arg_ptr,pre); do nArgValue=va_arg(arg_ptr,int); sum+=nArgValue; while(nArgValue!=0); /自定义结束条件是输入参数为0 va_end(arg_ptr); return sum;int main() coutadd(1,2,3,0)endl; /必须以0结尾,因为参数列表结束的判断条件是读到0停止 return 0;/版本2建立参数个数不定的函数是可能的。如标准库函数printf,它的参数个数是不定的。虽然printf至少必须用一个字符串作为其第一个参数,但是它能够接收任何个数的附加参数。printf函数的原型为: int printf(const char *format, .);该函数原型中的省略号(.)表示这个函数接收个数不定的任何类型的参数。注意省略号必须放在参数列表的最后。 变长参数头文件stdarg.h中的宏定义(见下表)课用来建立变长参数列表。下面给出的演示程序中给出了接收可变参数个数的函数average。函数average的第一个参数是要被求平均值的数据的个数。+-+| 在头文件stdarg.h中定义的类型和宏 |+-+| 标识苻 | 解释 | +-+-+| va_list | 用来保存va_start, va_end所需信息的一种类型。为了访问变长参数列 | | 表中的参数,必须声明va_list类型的一个对象 | +-+-+| va_start | 访问变长参数列表中的参数之前使用的宏,它初始化用va_list声明的 | | 的对象,初始化结果供宏va_arg 和va_end使用。 |+-+-+| va_arg | 展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的 | | 值和类型。每次调用va_arg都会修改用va_list声明的对象,从而使该 | | 对象指向参数列表中的下一个参数。 |+-+-+| va_end | 该宏使程序能够从变长参数列表用宏va_start应用的函数中正常返回 |+-+-+ 函数average使用了头文件stdarg.h中所有的年个月和宏。宏va_start, va_arg和va_end 用va_list类型的对象ap处理函数avergage的变长参数列表。 函数先用va_start初始化供va_arg 和va_end 使用的对象ap。 宏va_start有两个参数,一个是对象ap,另各一个是变长参数列表中省略号前的最右边参数的标识符(本例中为i,va_start用i确定变长参数列表的起始位置)。 然后,函数average反复把变长参数列表中的参数与变量total相加,加到total中值是用宏va_arg从变长参数列表中检索到的。宏va_arg有两个参数,一个是对象ap,另一个是要从参数列表中接收的值的类型(本例中为double),它返回该参数的值。宏va_end只有对象ap这样一个参数。函数average用宏va_end使得程序从average正常返回到main。最终,函数计算平均值返回到main。 常见的程设计错误是把省略号放在函数参数列表中间。省略号只能放在参数列表的最后。那么函数printf和scanf是怎样知道宏va_arg每次使用的类型的呢?答案是printf和scanf是通过扫描格式控制串中的格式转换苻来确定所要处理的下一个参数的类型的。附测试程序:VarParam.c, RedHat Linux 9.0 下测试通过。#include #include double average(int, .);main() double w = 37.5, x = 22.5, y = 1.7, z = 10.2; printf(w = %.1fnx = %.1fny = %.1fnz = %.1fn, w, x, y, z); printf(the average of w and x is : %f.1n, average(2, w, x); printf(the average of w, x and y is : %f.1n, average(3, w, x, y); printf(the average of w, x, y and z is : %f.1n, average(4, w, x, y, z);double average(int i, .) double total = 0; int j; va_list ap; va_start(ap, i); for (j = 1; j = i; j+) total += va_arg(ap, double); va_en

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论