[C++]可变参数函数

概述

什么是可变参数函数(Variadic functions),就是在进行函数调用的时候,可以向这个函数传递不同数量的参数。与之相对的就是固定参数函数,即一旦函数被定义,参数的类型和数量就确定下来了,在进行函数调用的时候,只能传递确定类型和数量的参数。可变参数函数增加了程序的灵活性,可变参数函数包含最少一个固定参数,并且最后一个参数必须是省略号(...),通过省略号,可以传递任意数量的参数。

语法

int function_name(data_type variable_name, ...);

必须包含的头文件及相关的宏定义

可变参数函数在进行函数定义时需要使用头文件#include <stdarg.h>中的宏定义去获取传进来的参数。

主要包括以下几个宏定义:

  • va_start(va_list ap, last_arg):初始化可变参数列表。ap是一个va_list类型的变量,last_arg是最后一个固定参数的名称(也就是可变参数列表之前的参数)。该宏将ap指向可变参数列表中的第一个参数。
  • va_arg(va_list ap, type):获取可变参数列表中的下一个参数。ap是一个va_list类型的变量,type是下一个参数的类型。该宏返回类型为type的值,并将ap指向下一个参数。
  • va_end(va_list ap):结束可变参数列表的访问。ap是一个va_list类型的变量。该宏将ap置为NULL
  • va_copy(va_list dest, va_list src):使用当前的src值来初始化参数指针dest。然后就可以使用dest中的备份获取可选参数列表,从src所引用的位置开始。

其中,va_list是头文件中定义的一个类型变量,它保存的信息会被以上几个宏定义使用。

Example 1

// C program for the above approach

#include <stdarg.h>
#include <stdio.h>

// Variadic function to add numbers
int AddNumbers(int n, ...)
{
	int Sum = 0;

	// Declaring pointer to the
	// argument list
	va_list ptr;

	// Initializing argument to the
	// list pointer
	va_start(ptr, n);

	for (int i = 0; i < n; i++)

		// Accessing current variable
		// and pointing to next one
		Sum += va_arg(ptr, int);

	// Ending argument list traversal
	va_end(ptr);

	return Sum;
}

// Driver Code
int main()
{
	printf("\n\n Variadic functions: \n");

	// Variable number of arguments
	printf("\n 1 + 2 = %d ",
		AddNumbers(2, 1, 2));

	printf("\n 3 + 4 + 5 = %d ",
		AddNumbers(3, 3, 4, 5));

	printf("\n 6 + 7 + 8 + 9 = %d ",
		AddNumbers(4, 6, 7, 8, 9));

	printf("\n");

	return 0;
}

Output

Variadic functions: 

1 + 2 = 3 
3 + 4 + 5 = 12 
6 + 7 + 8 + 9 = 30
 

Example 2

// C program for the above approach
#include <stdarg.h>
#include <stdio.h>

// Variadic function to find the largest number
int LargestNumber(int n, ...)
{
	// Declaring pointer to the
	// argument list
	va_list ptr;

	// Initializing argument to the
	// list pointer
	va_start(ptr, n);

	int max = va_arg(ptr, int);

	for (int i = 0; i < n-1; i++) {

		// Accessing current variable
		// and pointing to next
		int temp = va_arg(ptr, int);
		max = temp > max ? temp : max;
	}

	// End of argument list traversal
	va_end(ptr);

	return max;
}

// Driver Code
int main()
{
	printf("\n\n Variadic functions: \n");

	// Variable number of arguments
	printf("\n %d ",
		LargestNumber(2, 1, 2));

	printf("\n %d ",
		LargestNumber(3, 3, 4, 5));

	printf("\n %d ",
		LargestNumber(4, 6, 7, 8, 9));

	printf("\n");

	return 0;
}

Output

Variadic functions: 

2 
5 
9 
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1768317420

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值