省略符形参的使用

在c++ primer书上看到标题为“含有可变形参的函数”的章节,内容如下:

省略符形参的使用

答:

你可以传递任意数量的参数给他,所以当然跟没有参数的函数有区别了(没有参数的函数,你是不可以给他传递任何参数的)。

注意省略号的优先级别最低,所以在函数解析时,只有当其它所有的函数都无法调用时,编译器才会考虑调用省略号函数的。

(以下C语言的代码来解释)

#include <stdio.h>

#include <stdarg.h>

void Function(const char *str, … )
{
     va_list ap;

     int n = 3;

     char *a = NULL;

    int b = 0;

     double c = 0.0;

     va_start(ap, str); // 注意!这里第二个参数是本函数的第一个形参

     a = va_arg(ap, char*);

     b = va_arg(ap, int);

     c = va_arg(ap, double);
     // 浮点最好用double类型,而不要用float类型;否则数据会有问题

     va_end(ap);

     printf("%s is %s %d, %f", str, a, b, c);
}

void main()
{
       Function(“Hello”, “world”, 1, 3.14);
}

对于void Function(const char *str, …):

1、处理不定参数的函数要包含头文件:#include <stdarg.h>
然后在处理不定参数的函数中先定义一个参数列表变量:va_list ap。

2、确定不定参数所在的位置。在这里,第一个参数为str,因此要从第二个参数进行获取参数列表。va_start(ap, str);表示在str参数之后获取参数。由于C调用是从右到左依次将参数压入堆栈的,因此处理起来比较容易。

3、获取参数并指明类型,如:va_arg(ap, char*);获取第一个参数,并指明类型为char* 。
在main()函数中就对应着实参"world";va_arg(ap, int);紧接着再取一个参数,并指明类型为int,对应main()函数中的实参1;va_arg(ap, double);再接着取第三个参数,并指明类型为double,对应main()中的实参3.14。

4、最后注意要有va_end(ap)。