概述
什么是可变参数函数(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