C++可变参数

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: C++可变参数


Java中的可变参数其实就是数组,对C++的可变参数比较好奇,所以上网查了资料,了解下!

首先,C++中可变参数的定义:

void function(...)

我们一般会在参数中定义可变参数的个数,所以有以下形式:

void function(int num ...)

我在Visual Studio 2010下试验过void function(int num, ...)也能正常编译。

下面先看一个例子:

#include <iostream>
#include <cstdarg>
using namespace std;

void print(int num ...)
{
   
    va_list ap;
    va_start(ap, num);
    for (int i = 0; i < num; i++)
    {
   
        cout<<va_arg(ap,int)<<endl;
    }
    va_end(ap);
}

int main() 
{
   
    print(9,1,2,3,4,5,6,7,8,9);
    return 0;
}

结果如下:

1
2
3
4
5
6
7
8
9
请按任意键继续...

在使用可变参数时必须要用到三个库函数va_start()、va_arg()和va_end()。使用这三个函数时,必须包含“stdarg.h”(C风格)或者“cstdarg”(C++风格)。

首先,要定义一个va_list类型的变量,如实例中的ap。va_list与int,float类同,它是C++系统预定义的一个数据类型,只有通过这种类型的变量才能从实参表中取出可变参数。

va_start()函数具有两个参数,第一个参数时va_list类型的变量,第二个参数是省略号“...”前面的变量名。该函数的作用是初始化参数个数可变的函数,为取第一个可变的参数做好准备。

函数va_arg()也具有两个参数,第一个参数与函数va_start()的第一个参数相同,第二个参数应该是一个C++中预定义的数据类型,如实例中int。该函数的作用是将第一个参数所指向的可变参数转换成由第二个参数所指定的类型的数据,并将该数据作为函数va_arg()的返回值,同时使va_arg()的第一个参数指向下一个可变的参数,为取下一个可变参数做好准备。

函数va_end()只有一个参数,该参数必须与函数va_start()的第一个参数相同。该函数的作用是做好取可变实参的收尾工作,以便参数个数可变的函数能够正常返回。

使用可变参数的函数要注意一下几点:

(1)定义函数时,固定参数部分放在参数表的前面,省略号“...”表示可变参数。

(2)必须使用函数va_start()来初始化可变参数,为取第一个可变参数做好准备工作;使用函数va_arg()依次取各个可变参数值;最后用函数va_end()做好结束工作,以便能正确地返回。

(3)在调用参数个数可变的函数时,必定有一个参数指明可变参数的个数或总的参数个数。

目录
相关文章
|
7月前
|
安全 JavaScript Java
C++11:可变参数模板
C++11:可变参数模板
|
7月前
|
存储 C++
【C++】可变参数模板使用总结(简洁易懂,详细,含代码演示)
【C++】可变参数模板使用总结(简洁易懂,详细,含代码演示)
|
7月前
|
存储 编译器 C语言
【C++11特性篇】模板的新一力将:可变参数模板 [全解析]
【C++11特性篇】模板的新一力将:可变参数模板 [全解析]
|
机器学习/深度学习 编译器 C++
C++11:类的新功能和可变参数模板
C++11:类的新功能和可变参数模板
87 1
|
7月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
108 5
|
3月前
|
存储 算法 程序员
C++ 11新特性之可变参数模板
C++ 11新特性之可变参数模板
58 0
|
7月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(中)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
65 2
|
7月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(上)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
43 1
|
7月前
|
算法 编译器 C++
【C++入门到精通】新的类功能 | 可变参数模板 C++11 [ C++入门 ]
【C++入门到精通】新的类功能 | 可变参数模板 C++11 [ C++入门 ]
61 1
|
7月前
|
存储 安全 C语言
C++中灵活 处理可变参数的多种方式:优缺点、应用场景及示例对比
C++中灵活 处理可变参数的多种方式:优缺点、应用场景及示例对比
141 1