C语言中的不定参数
定义:在C语言中,可以使用不定参数函数(variadic functions)来处理可变数量的参数。这些函数可以接受不定数量的参数,并且在函数内部可以使用一些特殊的宏来访问这些参数。
在C语言中,不定参数通常与标准库中的<stdarg.h>头文件一起使用,以下是一些关键的宏和函数,用于处理不定参数函数:
va_list:va_list是一个类型,用于定义一个指向参数列表的对象。通常会在函数中声明一个va_list对象来处理可变参数。
va_start:va_start宏用于初始化va_list对象,使其指向参数列表的第一个参数。
va_arg:va_arg宏用于从参数列表中获取下一个参数的值。需要提供参数的类型作为第二个参数。
va_end:va_end宏用于关闭va_list对象,以便系统可以释放相应的资源。
以下是一个简单示例:
/*不定参宏函数的使用*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#define LOG(fmt, ...) printf("[%s:%d]" fmt, __FILE__, __LINE__, ##__VA_ARGS__);
void printNum(int count, ...) //C语言中不定参函数的使用
{
va_list ap;
va_start(ap, count); //获取指定参数的起始地址,获取count参数之后的第一个参数的地址
for (int i = 0; i < count; i++)
{
int num = va_arg(ap, int);
printf("param[%d]:%d\n", i ,num);
}
va_end(ap); //将ap指针置空
}
void myprintf(const char *fmt, ...)
{
va_list ap; //定义一个va_list对象
va_start(ap, fmt);
char *res;
int ret = vasprintf(&res, fmt, ap);
if(ret != -1)
{
printf(res);
free(res); //释放内存
}
va_end(ap); //将ap指针置空
}
int main()
{
LOG("比特就业课");
printNum(5, 3,4,6,7,8);
myprintf("%s-%d", "比特就业课", 666);
myprintf("%s-%d", "比特就业课");
return 0;
}
C++中的不定参数
在C++中,可以使用可变参数模板(variadic templates)来处理不定数量的参数。C++11引入了这一功能,允许编写可以接受任意数量参数的函数或类模板,可变参数模板使用递归展开技术来处理参数列表。
以下是一个示例代码:
#include <iostream>
/*
C++不定参函数使用
*/
void xprintf()
{
std::cout << std::endl;
}
template<typename T, typename ...Args> //函数模版
void xprintf(const T &v, Args &&...args)
{
std::cout << v;
if((sizeof ...(args)) > 0)
{
xprintf(std::forward<Args>(args)...); //递归调用
}
else
{
xprintf(); //调用无参函数
}
}
int main()
{
xprintf("比特");
xprintf("比特","就业课");
xprintf("比特","结业课",666);
return 0;
}
C++的可变参数模板非常强大,可以用于各种情况,包括实现通用的函数和类,以处理不定数量和类型的参数。这在编写泛型代码时非常有用。